sock : Add IPv6 support
This commit is contained in:
committed by
Dmitry Podgorny
parent
f326c2f42f
commit
b2a98fb9b6
37
src/sock.c
37
src/sock.c
@@ -85,31 +85,32 @@ sock_t sock_connect(const char * const host, const unsigned int port)
|
|||||||
snprintf(service, 6, "%u", port);
|
snprintf(service, 6, "%u", port);
|
||||||
|
|
||||||
memset(&hints, 0, sizeof(struct addrinfo));
|
memset(&hints, 0, sizeof(struct addrinfo));
|
||||||
hints.ai_family = AF_INET;
|
hints.ai_family = AF_UNSPEC;
|
||||||
|
hints.ai_flags = AI_ADDRCONFIG;
|
||||||
hints.ai_protocol = IPPROTO_TCP;
|
hints.ai_protocol = IPPROTO_TCP;
|
||||||
hints.ai_socktype = SOCK_STREAM;
|
hints.ai_socktype = SOCK_STREAM;
|
||||||
|
|
||||||
if ((err = getaddrinfo(host, service, &hints, &res)) != 0)
|
err = getaddrinfo(host, service, &hints, &res);
|
||||||
return -1;
|
if (err != 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
ainfo = res;
|
for (ainfo = res; ainfo != NULL; ainfo = ainfo->ai_next) {
|
||||||
while (ainfo) {
|
sock = socket(ainfo->ai_family, ainfo->ai_socktype, ainfo->ai_protocol);
|
||||||
if ((sock = socket(ainfo->ai_family, ainfo->ai_socktype,
|
if (sock < 0)
|
||||||
ainfo->ai_protocol)) >= 0) {
|
continue;
|
||||||
sock_set_nonblocking(sock);
|
|
||||||
|
|
||||||
err = connect(sock, ainfo->ai_addr, ainfo->ai_addrlen);
|
err = connect(sock, ainfo->ai_addr, ainfo->ai_addrlen);
|
||||||
|
if (err < 0) {
|
||||||
|
close(sock);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if ((err == 0) || (err < 0 && _in_progress(sock_error())))
|
/* Connection has been established. */
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
|
|
||||||
ainfo = ainfo->ai_next;
|
|
||||||
}
|
}
|
||||||
|
freeaddrinfo(res);
|
||||||
|
|
||||||
if (res) freeaddrinfo(res);
|
return ainfo == NULL ? -1 : sock;
|
||||||
|
|
||||||
return sock;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int sock_close(const sock_t sock)
|
int sock_close(const sock_t sock)
|
||||||
@@ -167,7 +168,7 @@ int sock_connect_error(const sock_t sock)
|
|||||||
unsigned len;
|
unsigned len;
|
||||||
char temp;
|
char temp;
|
||||||
|
|
||||||
sa.sa_family = AF_INET;
|
sa.sa_family = AF_UNSPEC;
|
||||||
|
|
||||||
len = sizeof(sa);
|
len = sizeof(sa);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user