sock : Add IPv6 support

This commit is contained in:
Chih-Wei Chen
2014-09-15 10:35:41 +08:00
committed by Dmitry Podgorny
parent f326c2f42f
commit b2a98fb9b6

View File

@@ -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);