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
25
sim_sock.c
25
sim_sock.c
|
@ -135,7 +135,10 @@ static struct sock_errors {
|
||||||
{WSAECONNRESET, "Connection reset by peer"},
|
{WSAECONNRESET, "Connection reset by peer"},
|
||||||
{WSAECONNREFUSED, "Connection refused"},
|
{WSAECONNREFUSED, "Connection refused"},
|
||||||
{WSAEHOSTUNREACH, "No route to host"},
|
{WSAEHOSTUNREACH, "No route to host"},
|
||||||
{WSAEADDRINUSE, "Address already in use "},
|
{WSAEADDRINUSE, "Address already in use"},
|
||||||
|
#if defined (WSAEAFNOSUPPORT)
|
||||||
|
{WSAEAFNOSUPPORT, "Address family not supported by protocol"},
|
||||||
|
#endif
|
||||||
{WSAEACCES, "Permission denied"},
|
{WSAEACCES, "Permission denied"},
|
||||||
{0, NULL}
|
{0, NULL}
|
||||||
};
|
};
|
||||||
|
@ -154,8 +157,13 @@ for (i=0; (sock_errors[i].text) && (sock_errors[i].value != err); i++)
|
||||||
if (sock_errors[i].value == err)
|
if (sock_errors[i].value == err)
|
||||||
printf ("Sockets: %s error %d - %s\n", emsg, err, sock_errors[i].text);
|
printf ("Sockets: %s error %d - %s\n", emsg, err, sock_errors[i].text);
|
||||||
else
|
else
|
||||||
|
#if defined(_WIN32)
|
||||||
printf ("Sockets: %s error %d\n", emsg, err);
|
printf ("Sockets: %s error %d\n", emsg, err);
|
||||||
sim_close_sock (s, flg);
|
#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;
|
return INVALID_SOCKET;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -692,8 +700,11 @@ int32 err;
|
||||||
newsock = socket (af, SOCK_STREAM, 0); /* create socket */
|
newsock = socket (af, SOCK_STREAM, 0); /* create socket */
|
||||||
if (newsock == INVALID_SOCKET) { /* socket error? */
|
if (newsock == INVALID_SOCKET) { /* socket error? */
|
||||||
err = WSAGetLastError ();
|
err = WSAGetLastError ();
|
||||||
printf ("Sockets: socket error %d\n", err);
|
#if defined(WSAEAFNOSUPPORT)
|
||||||
return INVALID_SOCKET;
|
if (err == WSAEAFNOSUPPORT) /* expected error, just return */
|
||||||
|
return newsock;
|
||||||
|
#endif
|
||||||
|
return sim_err_sock (newsock, "socket", 0); /* report error and return */
|
||||||
}
|
}
|
||||||
return newsock;
|
return newsock;
|
||||||
}
|
}
|
||||||
|
@ -752,6 +763,12 @@ if (newsock == INVALID_SOCKET) { /* socket error? */
|
||||||
preferred = preferred->ai_next;
|
preferred = preferred->ai_next;
|
||||||
goto retry;
|
goto retry;
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
if ((preferred->ai_family == AF_INET6) &&
|
||||||
|
(preferred != result)) {
|
||||||
|
preferred = result;
|
||||||
|
goto retry;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
p_freeaddrinfo(result);
|
p_freeaddrinfo(result);
|
||||||
return newsock;
|
return newsock;
|
||||||
|
|
|
@ -66,6 +66,9 @@
|
||||||
#define WSAECONNREFUSED ECONNREFUSED
|
#define WSAECONNREFUSED ECONNREFUSED
|
||||||
#define WSAEHOSTUNREACH EHOSTUNREACH
|
#define WSAEHOSTUNREACH EHOSTUNREACH
|
||||||
#define WSAEADDRINUSE EADDRINUSE
|
#define WSAEADDRINUSE EADDRINUSE
|
||||||
|
#if defined(EAFNOSUPPORT)
|
||||||
|
#define WSAEAFNOSUPPORT EAFNOSUPPORT
|
||||||
|
#endif
|
||||||
#define WSAEACCES EACCES
|
#define WSAEACCES EACCES
|
||||||
#define INVALID_SOCKET ((SOCKET)-1)
|
#define INVALID_SOCKET ((SOCKET)-1)
|
||||||
#define SOCKET_ERROR -1
|
#define SOCKET_ERROR -1
|
||||||
|
|
Loading…
Add table
Reference in a new issue