33 #if defined(_WIN32) || _POSIX_C_SOURCE >= 200112L
48 static void sock_fini(
struct io_handle *handle);
50 static ssize_t sock_read(
struct io_handle *handle,
void *buf,
size_t nbytes);
51 static ssize_t sock_write(
52 struct io_handle *handle,
const void *buf,
size_t nbytes);
53 static ssize_t sock_recv(
struct io_handle *handle,
void *buf,
size_t nbytes,
55 static ssize_t sock_send(
struct io_handle *handle,
const void *buf,
61 .size =
sizeof(
struct sock),
68 .accept = &sock_accept,
69 .connect = &sock_connect };
71 static int _socketpair(
int af,
int type,
int protocol, SOCKET sv[2]);
79 #if defined(__CYGWIN__) || defined(__linux__)
80 flags |= SOCK_CLOEXEC;
89 s = socket(AF_BTH, SOCK_STREAM, BTHPROTO_RFCOMM);
94 #elif defined(__linux__) && defined(HAVE_BLUETOOTH_BLUETOOTH_H) \
95 && defined(HAVE_BLUETOOTH_RFCOMM_H)
99 s = socket(AF_BLUETOOTH, SOCK_STREAM | flags,
109 s = socket(AF_INET, SOCK_STREAM | flags, 0);
112 s = socket(AF_INET, SOCK_DGRAM | flags, 0);
120 s = socket(AF_INET6, SOCK_STREAM | flags, 0);
123 s = socket(AF_INET6, SOCK_DGRAM | flags, 0);
128 #if _POSIX_C_SOURCE >= 200112L
132 s = socket(AF_UNIX, SOCK_STREAM | flags, 0);
135 s = socket(AF_UNIX, SOCK_DGRAM | flags, 0);
144 if (s == INVALID_SOCKET) {
149 #if _POSIX_C_SOURCE >= 200112L && !defined(__CYGINW__) && !defined(__linux__)
150 if (fcntl(s, F_SETFD, FD_CLOEXEC) == -1) {
159 goto error_alloc_handle;
162 handle->
fd = (HANDLE)s;
164 ((
struct sock *)handle)->type =
type;
169 #if _POSIX_C_SOURCE >= 200112L && !defined(__CYGINW__) && !defined(__linux__)
183 assert(handle_vector);
189 #if defined(__CYGWIN__) || defined(__linux__)
190 flags |= SOCK_CLOEXEC;
194 SOCKET socket_vector[2];
199 result = _socketpair(AF_INET, SOCK_STREAM | flags, 0,
203 result = _socketpair(AF_INET, SOCK_DGRAM | flags, 0,
212 result = _socketpair(AF_INET6, SOCK_STREAM | flags, 0,
216 result = _socketpair(AF_INET6, SOCK_DGRAM | flags, 0,
222 #if _POSIX_C_SOURCE >= 200112L
226 result = _socketpair(AF_UNIX, SOCK_STREAM | flags, 0,
230 result = _socketpair(AF_UNIX, SOCK_DGRAM | flags, 0,
240 if (result == SOCKET_ERROR) {
242 goto error_socketpair;
245 #if _POSIX_C_SOURCE >= 200112L && !defined(__CYGINW__) && !defined(__linux__)
246 if (fcntl(socket_vector[0], F_SETFD, FD_CLOEXEC) == -1) {
250 if (fcntl(socket_vector[1], F_SETFD, FD_CLOEXEC) == -1) {
257 if (!handle_vector[0]) {
259 goto error_alloc_handle_vector_0;
262 handle_vector[0]->
fd = (HANDLE)socket_vector[0];
263 ((
struct sock *)handle_vector[0])->domain =
domain;
264 ((
struct sock *)handle_vector[0])->type =
type;
267 if (!handle_vector[1]) {
269 goto error_alloc_handle_vector_1;
272 handle_vector[1]->fd = (HANDLE)socket_vector[1];
273 ((
struct sock *)handle_vector[1])->domain =
domain;
274 ((
struct sock *)handle_vector[1])->type =
type;
281 error_alloc_handle_vector_1:
284 error_alloc_handle_vector_0:
286 #if _POSIX_C_SOURCE >= 200112L && !defined(__CYGINW__) && !defined(__linux__)
289 closesocket(socket_vector[1]);
290 closesocket(socket_vector[0]);
298 #endif // _WIN32 || _POSIX_C_SOURCE >= 200112L
309 assert(handle->
vtab);
315 return handle->
vtab->
recv(handle, buf, nbytes, addr, flags);
327 assert(handle->
vtab);
333 return handle->
vtab->
send(handle, buf, nbytes, addr, flags);
344 assert(handle->
vtab);
361 assert(handle->
vtab);
370 #if defined(_WIN32) || _POSIX_C_SOURCE >= 200112L
380 if (handle->
vtab != &sock_vtab) {
385 return ((
struct sock *)handle)->domain;
396 if (handle->
vtab != &sock_vtab) {
401 return ((
struct sock *)handle)->type;
414 return bind((SOCKET)handle->
fd, (
const struct sockaddr *)&addr->
addr,
426 return listen((SOCKET)handle->
fd, backlog) ? -1 : 0;
462 return shutdown((SOCKET)handle->
fd, how) ? -1 : 0;
478 return getsockname((SOCKET)handle->
fd, (
struct sockaddr *)&addr->
addr,
479 (socklen_t *)&addr->
addrlen) ? -1 : 0;
483 int result = getsockname(handle->
fd, (
struct sockaddr *)&addr->
addr,
486 if (!result || errno != EINVAL
490 return getsockname(handle->
fd, (
struct sockaddr *)&addr->
addr,
508 return getpeername((SOCKET)handle->
fd, (
struct sockaddr *)&addr->
addr,
509 (socklen_t *)&addr->
addrlen) ? -1 : 0;
513 int result = getpeername(handle->
fd, (
struct sockaddr *)&addr->
addr,
516 if (!result || errno != EINVAL
520 return getpeername(handle->
fd, (
struct sockaddr *)&addr->
addr,
545 if (getsockopt((SOCKET)handle->
fd, SOL_SOCKET, SO_ACCEPTCONN,
546 (
char *)&optval, &(socklen_t){ sizeof(optval) }))
566 if (getsockopt((SOCKET)handle->
fd, SOL_SOCKET, SO_BROADCAST,
567 (
char *)&optval, &(socklen_t){ sizeof(optval) }))
582 BOOL optval = !!broadcast;
584 int optval = !!broadcast;
587 return setsockopt((SOCKET)handle->
fd, SOL_SOCKET, SO_BROADCAST,
588 (
const char *)&optval,
sizeof(optval)) ? -1 : 0;
606 if (getsockopt((SOCKET)handle->
fd, SOL_SOCKET, SO_DEBUG,
607 (
char *)&optval, &(socklen_t){ sizeof(optval) }))
622 BOOL optval = !!debug;
624 int optval = !!debug;
627 return setsockopt((SOCKET)handle->
fd, SOL_SOCKET, SO_DEBUG,
628 (
const char *)&optval,
sizeof(optval)) ? -1 : 0;
646 if (getsockopt((SOCKET)handle->
fd, SOL_SOCKET, SO_DONTROUTE,
647 (
char *)&optval, &(socklen_t){ sizeof(optval) }))
662 BOOL optval = !!dontroute;
664 int optval = !!dontroute;
667 return setsockopt((SOCKET)handle->
fd, SOL_SOCKET, SO_DONTROUTE,
668 (
const char *)&optval,
sizeof(optval)) ? -1 : 0;
681 return getsockopt((SOCKET)handle->
fd, SOL_SOCKET, SO_ERROR,
682 (
char *)perror, &(socklen_t){ sizeof(*perror) })
701 if (getsockopt((SOCKET)handle->
fd, SOL_SOCKET, SO_KEEPALIVE,
702 (
char *)&optval, &(socklen_t){ sizeof(optval) }))
717 struct tcp_keepalive kaInBuffer = { .onoff = keepalive,
719 .keepalivetime = time * 1000,
721 .keepaliveinterval = interval * 1000 };
722 DWORD dwBytesReturned;
724 return WSAIoctl((SOCKET)handle->
fd, SIO_KEEPALIVE_VALS, &kaInBuffer,
725 sizeof(kaInBuffer), NULL, 0, &dwBytesReturned, NULL,
730 if (setsockopt(handle->
fd, SOL_SOCKET, SO_KEEPALIVE, &keepalive,
731 sizeof(keepalive)) == -1)
737 if (setsockopt(handle->
fd, SOL_TCP, TCP_KEEPIDLE, &time,
742 if (setsockopt(handle->
fd, SOL_TCP, TCP_KEEPINTVL, &interval,
743 sizeof(interval)) == -1)
763 struct linger optval;
765 if (getsockopt((SOCKET)handle->
fd, SOL_SOCKET, SO_LINGER,
766 (
char *)&optval, &(socklen_t){ sizeof(optval) }))
769 return optval.l_onoff ? optval.l_linger : 0;
785 struct linger optval = { !!time, time };
787 return setsockopt((SOCKET)handle->
fd, SOL_SOCKET, SO_LINGER,
788 (
const char *)&optval,
sizeof(optval)) ? -1 : 0;
806 if (getsockopt((SOCKET)handle->
fd, SOL_SOCKET, SO_OOBINLINE,
807 (
char *)&optval, &(socklen_t){ sizeof(optval) }))
822 BOOL optval = !!oobinline;
824 int optval = !!oobinline;
827 return setsockopt((SOCKET)handle->
fd, SOL_SOCKET, SO_OOBINLINE,
828 (
const char *)&optval,
sizeof(optval)) ? -1 : 0;
842 if (getsockopt((SOCKET)handle->
fd, SOL_SOCKET, SO_RCVBUF,
843 (
char *)&optval, &(socklen_t){ sizeof(optval) }))
858 return setsockopt((SOCKET)handle->
fd, SOL_SOCKET, SO_RCVBUF,
859 (
const char *)&size,
sizeof(size)) ? -1 : 0;
872 DWORD optval = timeout;
874 struct timeval optval = { .tv_sec = timeout / 1000,
875 .tv_usec = (timeout % 1000) * 1000 };
878 return setsockopt((SOCKET)handle->
fd, SOL_SOCKET, SO_RCVTIMEO,
879 (
const char *)&optval,
sizeof(optval)) ? -1 : 0;
897 if (getsockopt((SOCKET)handle->
fd, SOL_SOCKET, SO_REUSEADDR,
898 (
char *)&optval, &(socklen_t){ sizeof(optval) }))
913 BOOL optval = !!reuseaddr;
915 int optval = !!reuseaddr;
918 return setsockopt((SOCKET)handle->
fd, SOL_SOCKET, SO_REUSEADDR,
919 (
const char *)&optval,
sizeof(optval)) ? -1 : 0;
933 if (getsockopt((SOCKET)handle->
fd, SOL_SOCKET, SO_SNDBUF,
934 (
char *)&optval, &(socklen_t){ sizeof(optval) }))
949 return setsockopt((SOCKET)handle->
fd, SOL_SOCKET, SO_SNDBUF,
950 (
const char *)&size,
sizeof(size)) ? -1 : 0;
963 DWORD optval = timeout;
965 struct timeval optval = { .tv_sec = timeout / 1000,
966 .tv_usec = (timeout % 1000) * 1000 };
969 return setsockopt((SOCKET)handle->
fd, SOL_SOCKET, SO_SNDTIMEO,
970 (
const char *)&optval,
sizeof(optval)) ? -1 : 0;
988 if (getsockopt((SOCKET)handle->
fd, IPPROTO_TCP, TCP_NODELAY,
989 (
char *)&optval, &(socklen_t){ sizeof(optval) }))
1004 BOOL optval = !!nodelay;
1006 int optval = !!nodelay;
1009 return setsockopt((SOCKET)handle->
fd, IPPROTO_TCP, TCP_NODELAY,
1010 (
const char *)&optval,
sizeof(optval)) ? -1 : 0;
1014 #if defined(_WIN32) || defined(HAVE_SYS_IOCTL_H)
1025 if (ioctlsocket((SOCKET)handle->
fd, FIONREAD, &optval))
1034 result = ioctl(handle->
fd, FIONREAD, &optval);
1035 }
while (result == -1 && errno == EINTR);
1043 #if defined(_WIN32) || defined(__CYGWIN__) || defined(__linux__)
1053 if (handle->
vtab != &sock_vtab) {
1063 switch (((
struct sock *)handle)->domain) {
1066 if (getsockopt((SOCKET)handle->fd, IPPROTO_IP,
1067 IP_MULTICAST_LOOP, (
char *)&optval,
1068 &(socklen_t){ sizeof(optval) }))
1074 if (getsockopt((SOCKET)handle->fd, IPPROTO_IPV6,
1075 IPV6_MULTICAST_LOOP, (
char *)&optval,
1076 &(socklen_t){ sizeof(optval) }))
1093 if (handle->
vtab != &sock_vtab) {
1099 DWORD optval = !!loop;
1101 int optval = !!loop;
1103 switch (((
struct sock *)handle)->domain) {
1106 return setsockopt((SOCKET)handle->fd, IPPROTO_IP,
1107 IP_MULTICAST_LOOP, (
const char *)&optval,
1108 sizeof(optval)) ? -1 : 0;
1112 return setsockopt((SOCKET)handle->fd, IPPROTO_IPV6,
1113 IPV6_MULTICAST_LOOP, (
const char *)&optval,
1114 sizeof(optval)) ? -1 : 0;
1128 if (handle->
vtab != &sock_vtab) {
1138 switch (((
struct sock *)handle)->domain) {
1141 if (getsockopt((SOCKET)handle->fd, IPPROTO_IP, IP_MULTICAST_TTL,
1143 &(socklen_t){ sizeof(optval) }))
1149 if (getsockopt((SOCKET)handle->fd, IPPROTO_IPV6,
1150 IPV6_MULTICAST_HOPS, (
char *)&optval,
1151 &(socklen_t){ sizeof(optval) }))
1168 if (handle->
vtab != &sock_vtab) {
1178 switch (((
struct sock *)handle)->domain) {
1181 return setsockopt((SOCKET)handle->fd, IPPROTO_IP,
1182 IP_MULTICAST_TTL, (
const char *)&optval,
1183 sizeof(optval)) ? -1 : 0;
1187 return setsockopt((SOCKET)handle->fd, IPPROTO_IPV6,
1188 IPV6_MULTICAST_HOPS, (
const char *)&optval,
1189 sizeof(optval)) ? -1 :0;
1206 if (handle->
vtab != &sock_vtab) {
1211 struct group_req greq;
1212 memset(&greq, 0,
sizeof(greq));
1213 greq.gr_interface = index;
1214 memcpy(&greq.gr_group, &group->
addr,
sizeof(greq.gr_group));
1220 return setsockopt((SOCKET)handle->
fd, level, MCAST_JOIN_GROUP,
1221 (
const char *)&greq,
sizeof(greq)) ? 0 : -1;
1237 if (handle->
vtab != &sock_vtab) {
1242 struct group_source_req greq;
1243 memset(&greq, 0,
sizeof(greq));
1244 greq.gsr_interface = index;
1245 memcpy(&greq.gsr_group, &group->
addr,
sizeof(greq.gsr_group));
1246 memcpy(&greq.gsr_source, &source->
addr,
sizeof(greq.gsr_source));
1252 return setsockopt((SOCKET)handle->
fd, level, MCAST_BLOCK_SOURCE,
1253 (
const char *)&greq,
sizeof(greq)) ? -1 : 0;
1269 if (handle->
vtab != &sock_vtab) {
1274 struct group_source_req greq;
1275 memset(&greq, 0,
sizeof(greq));
1276 greq.gsr_interface = index;
1277 memcpy(&greq.gsr_group, &group->
addr,
sizeof(greq.gsr_group));
1278 memcpy(&greq.gsr_source, &source->
addr,
sizeof(greq.gsr_source));
1284 return setsockopt((SOCKET)handle->
fd, level, MCAST_UNBLOCK_SOURCE,
1285 (
const char *)&greq,
sizeof(greq)) ? -1 : 0;
1300 if (handle->
vtab != &sock_vtab) {
1305 struct group_req greq;
1306 memset(&greq, 0,
sizeof(greq));
1307 greq.gr_interface = index;
1308 memcpy(&greq.gr_group, &group->
addr,
sizeof(greq.gr_group));
1314 return setsockopt((SOCKET)handle->
fd, level, MCAST_LEAVE_GROUP,
1315 (
const char *)&greq,
sizeof(greq)) ? -1 : 0;
1331 if (handle->
vtab != &sock_vtab) {
1336 struct group_source_req greq;
1337 memset(&greq, 0,
sizeof(greq));
1338 greq.gsr_interface = index;
1339 memcpy(&greq.gsr_group, &group->
addr,
sizeof(greq.gsr_group));
1340 memcpy(&greq.gsr_source, &source->
addr,
sizeof(greq.gsr_source));
1346 return setsockopt((SOCKET)handle->
fd, level, MCAST_JOIN_SOURCE_GROUP,
1347 (
const char *)&greq,
sizeof(greq)) ? -1 : 0;
1360 if (handle->
vtab != &sock_vtab) {
1365 struct group_source_req greq;
1366 memset(&greq, 0,
sizeof(greq));
1367 greq.gsr_interface = index;
1368 memcpy(&greq.gsr_group, &group->
addr,
sizeof(greq.gsr_group));
1369 memcpy(&greq.gsr_source, &source->
addr,
sizeof(greq.gsr_source));
1375 return setsockopt((SOCKET)handle->
fd, level, MCAST_LEAVE_SOURCE_GROUP,
1376 (
const char *)&greq,
sizeof(greq)) ? -1 : 0;
1380 #endif // _WIN32 || __CYGWIN__ || __linux__
1386 closesocket((SOCKET)handle->
fd);
1390 sock_flags(
struct io_handle *handle,
int flags)
1396 return ioctlsocket((SOCKET)handle->
fd, FIONBIO, &iMode) ? -1 : 0;
1398 int arg = fcntl(handle->
fd, F_GETFL, 0);
1403 return fcntl(handle->
fd, F_SETFL, arg | O_NONBLOCK);
1405 return fcntl(handle->
fd, F_SETFL, arg & ~O_NONBLOCK);
1411 sock_read(
struct io_handle *handle,
void *buf,
size_t nbytes)
1413 return sock_recv(handle, buf, nbytes, NULL, 0);
1417 sock_write(
struct io_handle *handle,
const void *buf,
size_t nbytes)
1419 return sock_send(handle, buf, nbytes, NULL, 0);
1434 _flags |= MSG_WAITALL;
1440 result = recvfrom((SOCKET)handle->
fd, buf, nbytes, _flags,
1446 result = recvfrom(handle->
fd, buf, nbytes, _flags,
1447 (
struct sockaddr *)&addr->
addr,
1449 }
while (result == -1 && errno == EINTR);
1453 result = recv((SOCKET)handle->
fd, buf, nbytes, _flags);
1458 result = recv(handle->
fd, buf, nbytes, _flags);
1459 }
while (result == -1 && errno == EINTR);
1462 return result == SOCKET_ERROR ? -1 : result;
1466 sock_send(
struct io_handle *handle,
const void *buf,
size_t nbytes,
1475 _flags |= MSG_NOSIGNAL;
1482 ? sendto((SOCKET)handle->
fd, buf, nbytes, _flags,
1483 (
const struct sockaddr *)&addr->
addr, addr->
addrlen)
1484 : send((SOCKET)handle->fd, buf, nbytes, _flags);
1492 ? sendto(handle->
fd, buf, nbytes, _flags,
1493 (
const struct sockaddr *)&addr->
addr,
1495 : send(handle->fd, buf, nbytes, _flags);
1497 }
while (result == -1 && errno == EINTR);
1499 return result == SOCKET_ERROR ? -1 : result;
1514 s = accept((SOCKET)handle->
fd, (
struct sockaddr *)&addr->
addr,
1521 s = accept4(handle->
fd, (
struct sockaddr *)&addr->
addr,
1525 s = accept(handle->
fd, (
struct sockaddr *)&addr->
addr,
1528 }
while (s == -1 && errno == EINTR);
1532 s = accept((SOCKET)handle->
fd, NULL, NULL);
1538 s = accept4(handle->
fd, NULL, NULL, SOCK_CLOEXEC);
1540 s = accept(handle->
fd, NULL, NULL);
1542 }
while (s == -1 && errno == EINTR);
1546 if (s == INVALID_SOCKET) {
1551 #if _POSIX_C_SOURCE >= 200112L && !defined(_GNU_SOURCE)
1552 if (fcntl(s, F_SETFD, FD_CLOEXEC) == -1) {
1561 goto error_alloc_handle;
1564 handle->
fd = (HANDLE)s;
1571 #if _POSIX_C_SOURCE >= 200112L && !defined(_GNU_SOURCE)
1591 return connect((SOCKET)handle->
fd, (
const struct sockaddr *)&addr->
addr,
1599 result = connect(handle->
fd,
1600 (
const struct sockaddr *)&addr->
addr,
1602 }
while (result == -1 && errno == EINTR);
1608 _socketpair(
int af,
int type,
int protocol, SOCKET sv[2])
1611 sv[0] = sv[1] = INVALID_SOCKET;
1613 #if _POSIX_C_SOURCE >= 200112L
1615 return socketpair(af,
type, protocol, sv);
1620 if (af != AF_INET && af != AF_INET6) {
1626 #if defined(__CYGWIN__) || defined(__linux__)
1627 flags =
type & (SOCK_NONBLOCK | SOCK_CLOEXEC);
1631 if (
type != SOCK_STREAM &&
type != SOCK_DGRAM) {
1636 sv[0] = socket(af,
type | flags, protocol);
1637 if (sv[0] == INVALID_SOCKET) {
1639 goto error_socket_0;
1642 sv[1] = socket(af,
type | flags, protocol);
1643 if (sv[1] == INVALID_SOCKET) {
1645 goto error_socket_1;
1648 struct sockaddr_storage name[2];
1649 struct sockaddr *name_0 = (
struct sockaddr *)&name[0];
1650 struct sockaddr_in *name_in_0 = (
struct sockaddr_in *)name_0;
1651 struct sockaddr_in6 *name_in6_0 = (
struct sockaddr_in6 *)name_0;
1652 struct sockaddr *name_1 = (
struct sockaddr *)&name[1];
1653 struct sockaddr_in *name_in_1 = (
struct sockaddr_in *)name_1;
1654 struct sockaddr_in6 *name_in6_1 = (
struct sockaddr_in6 *)name_1;
1655 socklen_t namelen_0, namelen_1;
1657 if (af == AF_INET) {
1658 name_in_1->sin_family = AF_INET;
1659 name_in_1->sin_port = 0;
1660 name_in_1->sin_addr.s_addr = htonl(INADDR_LOOPBACK);
1661 namelen_1 =
sizeof(*name_in_1);
1663 name_in6_1->sin6_family = AF_INET6;
1664 name_in6_1->sin6_port = 0;
1665 name_in6_1->sin6_addr = in6addr_loopback;
1666 namelen_1 =
sizeof(*name_in6_1);
1669 if (bind(sv[1], name_1, namelen_1) == SOCKET_ERROR) {
1673 if (getsockname(sv[1], name_1, &namelen_1) == SOCKET_ERROR) {
1675 goto error_getsockname_1;
1678 if (type == SOCK_STREAM) {
1679 if (listen(sv[1], 1) == SOCKET_ERROR) {
1684 if (af == AF_INET) {
1685 name_in_0->sin_family = AF_INET;
1686 name_in_0->sin_port = 0;
1687 name_in_0->sin_addr.s_addr = htonl(INADDR_LOOPBACK);
1688 namelen_0 =
sizeof(*name_in_0);
1690 name_in6_0->sin6_family = AF_INET6;
1691 name_in6_0->sin6_port = 0;
1692 name_in6_0->sin6_addr = in6addr_loopback;
1693 namelen_0 =
sizeof(*name_in6_0);
1696 if (bind(sv[0], name_0, namelen_0) == SOCKET_ERROR) {
1700 if (getsockname(sv[0], name_0, &namelen_0) == SOCKET_ERROR) {
1702 goto error_getsockname_0;
1707 name_in_1->sin_addr.s_addr = htonl(INADDR_LOOPBACK);
1709 name_in6_1->sin6_addr = in6addr_loopback;
1710 if (connect(sv[0], name_1, namelen_1) == SOCKET_ERROR) {
1712 goto error_connect_0;
1715 if (type == SOCK_STREAM) {
1716 SOCKET s = accept(sv[1], NULL, NULL);
1717 if (s == INVALID_SOCKET) {
1725 name_in_0->sin_addr.s_addr = htonl(INADDR_LOOPBACK);
1727 name_in6_0->sin6_addr = in6addr_loopback;
1728 if (connect(sv[1], name_0, namelen_0) == SOCKET_ERROR) {
1730 goto error_connect_1;
1739 error_getsockname_0:
1742 error_getsockname_1:
1745 sv[1] = INVALID_SOCKET;
1748 sv[0] = INVALID_SOCKET;
1755 #endif // _WIN32 || _POSIX_C_SOURCE >= 200112L