Fixed socket creation issue which happens on some IPv6 capable systems which don't have IPv6 enabled but return IPv6 family addresses with getaddrinfo. This is issue #48
This commit is contained in:
parent
02b3477d20
commit
b04b7ae5b1
2 changed files with 24 additions and 4 deletions
21
sim_sock.c
21
sim_sock.c
|
@ -136,6 +136,9 @@ static struct sock_errors {
|
|||
{WSAECONNREFUSED, "Connection refused"},
|
||||
{WSAEHOSTUNREACH, "No route to host"},
|
||||
{WSAEADDRINUSE, "Address already in use"},
|
||||
#if defined (WSAEAFNOSUPPORT)
|
||||
{WSAEAFNOSUPPORT, "Address family not supported by protocol"},
|
||||
#endif
|
||||
{WSAEACCES, "Permission denied"},
|
||||
{0, NULL}
|
||||
};
|
||||
|
@ -154,7 +157,12 @@ for (i=0; (sock_errors[i].text) && (sock_errors[i].value != err); i++)
|
|||
if (sock_errors[i].value == err)
|
||||
printf ("Sockets: %s error %d - %s\n", emsg, err, sock_errors[i].text);
|
||||
else
|
||||
#if defined(_WIN32)
|
||||
printf ("Sockets: %s error %d\n", emsg, err);
|
||||
#else
|
||||
printf ("Sockets: %s error %d - %s\n", emsg, err, strerror(err));
|
||||
#endif
|
||||
if (s != INVALID_SOCKET)
|
||||
sim_close_sock (s, flg);
|
||||
return INVALID_SOCKET;
|
||||
}
|
||||
|
@ -692,8 +700,11 @@ int32 err;
|
|||
newsock = socket (af, SOCK_STREAM, 0); /* create socket */
|
||||
if (newsock == INVALID_SOCKET) { /* socket error? */
|
||||
err = WSAGetLastError ();
|
||||
printf ("Sockets: socket error %d\n", err);
|
||||
return INVALID_SOCKET;
|
||||
#if defined(WSAEAFNOSUPPORT)
|
||||
if (err == WSAEAFNOSUPPORT) /* expected error, just return */
|
||||
return newsock;
|
||||
#endif
|
||||
return sim_err_sock (newsock, "socket", 0); /* report error and return */
|
||||
}
|
||||
return newsock;
|
||||
}
|
||||
|
@ -752,6 +763,12 @@ if (newsock == INVALID_SOCKET) { /* socket error? */
|
|||
preferred = preferred->ai_next;
|
||||
goto retry;
|
||||
}
|
||||
#else
|
||||
if ((preferred->ai_family == AF_INET6) &&
|
||||
(preferred != result)) {
|
||||
preferred = result;
|
||||
goto retry;
|
||||
}
|
||||
#endif
|
||||
p_freeaddrinfo(result);
|
||||
return newsock;
|
||||
|
|
|
@ -66,6 +66,9 @@
|
|||
#define WSAECONNREFUSED ECONNREFUSED
|
||||
#define WSAEHOSTUNREACH EHOSTUNREACH
|
||||
#define WSAEADDRINUSE EADDRINUSE
|
||||
#if defined(EAFNOSUPPORT)
|
||||
#define WSAEAFNOSUPPORT EAFNOSUPPORT
|
||||
#endif
|
||||
#define WSAEACCES EACCES
|
||||
#define INVALID_SOCKET ((SOCKET)-1)
|
||||
#define SOCKET_ERROR -1
|
||||
|
|
Loading…
Add table
Reference in a new issue