53 sizeof enable) == -1) {
54 return WSAGetLastError();
65 sizeof enable) == -1) {
66 return WSAGetLastError();
69 if (enable && setsockopt(
socket,
73 sizeof delay) == -1) {
74 return WSAGetLastError();
90 if (
handle->socket != INVALID_SOCKET)
94 if (ioctlsocket(
socket, FIONBIO, &yes) == SOCKET_ERROR) {
95 return WSAGetLastError();
99 if (!SetHandleInformation((HANDLE)
socket, HANDLE_FLAG_INHERIT, 0))
100 return GetLastError();
104 if (CreateIoCompletionPort((HANDLE)
socket,
111 return GetLastError();
124 if (!SetFileCompletionNotificationModes((HANDLE)
socket, sfcnm_flags))
125 return GetLastError();
158 domain =
flags & 0xFF;
159 if (domain != AF_INET && domain !=
AF_INET6 && domain != AF_UNSPEC)
166 handle->tcp.serv.accept_reqs = NULL;
167 handle->tcp.serv.pending_accepts = NULL;
168 handle->socket = INVALID_SOCKET;
170 handle->tcp.serv.func_acceptex = NULL;
171 handle->tcp.conn.func_connectex = NULL;
172 handle->tcp.serv.processed_accepts = 0;
173 handle->delayed_error = 0;
179 if (domain != AF_UNSPEC) {
183 sock =
socket(domain, SOCK_STREAM, 0);
184 if (sock == INVALID_SOCKET) {
185 err = WSAGetLastError();
211 uv_tcp_accept_t*
req;
214 handle->stream.conn.shutdown_req != NULL &&
215 handle->stream.conn.write_reqs_pending == 0) {
221 err = ERROR_OPERATION_ABORTED;
222 }
else if (shutdown(
handle->socket, SD_SEND) == SOCKET_ERROR) {
223 err = WSAGetLastError();
226 if (
handle->stream.conn.shutdown_req->cb) {
227 handle->stream.conn.shutdown_req->cb(
handle->stream.conn.shutdown_req,
231 handle->stream.conn.shutdown_req = NULL;
237 handle->reqs_pending == 0) {
242 handle->socket = INVALID_SOCKET;
251 UnregisterWait(
req->wait_handle);
254 if (
req->event_handle != NULL) {
255 CloseHandle(
req->event_handle);
256 req->event_handle = NULL;
262 handle->tcp.serv.accept_reqs = NULL;
268 UnregisterWait(
handle->read_req.wait_handle);
271 if (
handle->read_req.event_handle != NULL) {
272 CloseHandle(
handle->read_req.event_handle);
273 handle->read_req.event_handle = NULL;
278 loop->active_tcp_streams--;
295 const struct sockaddr*
addr,
296 unsigned int addrlen,
297 unsigned int flags) {
301 if (
handle->socket == INVALID_SOCKET) {
306 return ERROR_INVALID_PARAMETER;
308 sock =
socket(
addr->sa_family, SOCK_STREAM, 0);
309 if (sock == INVALID_SOCKET) {
310 return WSAGetLastError();
329 setsockopt(
handle->socket,
339 if (
r == SOCKET_ERROR) {
340 err = WSAGetLastError();
341 if (
err == WSAEADDRINUSE) {
365 if (!PostQueuedCompletionStatus(
handle->loop->iocp,
366 req->u.io.overlapped.InternalHigh,
368 &
req->u.io.overlapped)) {
384 if (!PostQueuedCompletionStatus(
handle->loop->iocp,
385 req->u.io.overlapped.InternalHigh,
387 &
req->u.io.overlapped)) {
397 SOCKET accept_socket;
401 assert(
req->accept_socket == INVALID_SOCKET);
411 accept_socket =
socket(family, SOCK_STREAM, 0);
412 if (accept_socket == INVALID_SOCKET) {
420 if (!SetHandleInformation((HANDLE) accept_socket, HANDLE_FLAG_INHERIT, 0)) {
429 memset(&(
req->u.io.overlapped), 0,
sizeof(
req->u.io.overlapped));
431 assert(
req->event_handle != NULL);
432 req->u.io.overlapped.hEvent = (HANDLE) ((ULONG_PTR)
req->event_handle | 1);
435 success =
handle->tcp.serv.func_acceptex(
handle->socket,
437 (
void*)
req->accept_buffer,
439 sizeof(
struct sockaddr_storage),
440 sizeof(
struct sockaddr_storage),
442 &
req->u.io.overlapped);
446 req->accept_socket = accept_socket;
451 req->accept_socket = accept_socket;
455 !RegisterWaitForSingleObject(&
req->wait_handle,
457 INFINITE, WT_EXECUTEINWAITTHREAD)) {
470 CloseHandle(
req->event_handle);
471 req->event_handle = NULL;
487 memset(&
req->u.io.overlapped, 0,
sizeof(
req->u.io.overlapped));
497 if (
handle->tcp.conn.read_buffer.base == NULL ||
498 handle->tcp.conn.read_buffer.len == 0) {
502 assert(
handle->tcp.conn.read_buffer.base != NULL);
511 memset(&(
req->u.io.overlapped), 0,
sizeof(
req->u.io.overlapped));
513 assert(
req->event_handle != NULL);
514 req->u.io.overlapped.hEvent = (HANDLE) ((ULONG_PTR)
req->event_handle | 1);
523 &
req->u.io.overlapped,
529 req->u.io.overlapped.InternalHigh =
bytes;
538 !RegisterWaitForSingleObject(&
req->wait_handle,
540 INFINITE, WT_EXECUTEINWAITTHREAD)) {
554 struct linger
l = { 1, 0 };
560 if (0 != setsockopt(
handle->socket, SOL_SOCKET, SO_LINGER, (
const char*)&
l,
sizeof(
l)))
569 unsigned int i, simultaneous_accepts;
570 uv_tcp_accept_t*
req;
576 handle->stream.serv.connection_cb =
cb;
583 if (
handle->delayed_error) {
584 return handle->delayed_error;
594 if (
handle->delayed_error)
595 return handle->delayed_error;
598 if (!
handle->tcp.serv.func_acceptex) {
600 return WSAEAFNOSUPPORT;
606 return WSAGetLastError();
610 handle->stream.serv.connection_cb =
cb;
616 if (
handle->tcp.serv.accept_reqs == NULL) {
617 handle->tcp.serv.accept_reqs =
619 if (!
handle->tcp.serv.accept_reqs) {
623 for (
i = 0;
i < simultaneous_accepts;
i++) {
626 req->accept_socket = INVALID_SOCKET;
631 req->event_handle = CreateEvent(NULL, 0, 0, NULL);
632 if (
req->event_handle == NULL) {
636 req->event_handle = NULL;
648 req->accept_socket = INVALID_SOCKET;
651 req->event_handle = NULL;
664 uv_tcp_accept_t*
req =
server->tcp.serv.pending_accepts;
668 return WSAEWOULDBLOCK;
671 if (
req->accept_socket == INVALID_SOCKET) {
695 server->tcp.serv.pending_accepts =
req->next_pending;
696 req->next_pending = NULL;
697 req->accept_socket = INVALID_SOCKET;
707 server->tcp.serv.processed_accepts++;
710 server->tcp.serv.processed_accepts = 0;
722 loop->active_tcp_streams++;
741 handle->read_req.event_handle == NULL) {
742 handle->read_req.event_handle = CreateEvent(NULL, 0, 0, NULL);
743 if (
handle->read_req.event_handle == NULL) {
756 const struct sockaddr*
addr,
757 unsigned int addrlen,
760 const struct sockaddr* bind_addr;
761 struct sockaddr_storage converted;
770 if (
handle->delayed_error) {
771 return handle->delayed_error;
785 if (
handle->delayed_error)
786 return handle->delayed_error;
789 if (!
handle->tcp.conn.func_connectex) {
791 return WSAEAFNOSUPPORT;
798 memset(&
req->u.io.overlapped, 0,
sizeof(
req->u.io.overlapped));
800 success =
handle->tcp.conn.func_connectex(
handle->socket,
801 (
const struct sockaddr*) &converted,
806 &
req->u.io.overlapped);
818 return WSAGetLastError();
826 struct sockaddr*
name,
838 struct sockaddr*
name,
863 memset(&(
req->u.io.overlapped), 0,
sizeof(
req->u.io.overlapped));
865 req->event_handle = CreateEvent(NULL, 0, 0, NULL);
866 if (
req->event_handle == NULL) {
869 req->u.io.overlapped.hEvent = (HANDLE) ((ULONG_PTR)
req->event_handle | 1);
878 &
req->u.io.overlapped,
883 req->u.io.queued_bytes = 0;
885 handle->stream.conn.write_reqs_pending++;
892 handle->stream.conn.write_reqs_pending++;
894 handle->write_queue_size +=
req->u.io.queued_bytes;
896 !RegisterWaitForSingleObject(&
req->wait_handle,
898 INFINITE, WT_EXECUTEINWAITTHREAD | WT_EXECUTEONLYONCE)) {
904 req->u.io.queued_bytes = 0;
906 handle->stream.conn.write_reqs_pending++;
918 unsigned int nbufs) {
922 if (
handle->stream.conn.write_reqs_pending > 0)
933 if (
result == SOCKET_ERROR)
946 assert(
handle->type == UV_TCP);
961 if (
err == WSAECONNABORTED) {
974 if (
req->u.io.overlapped.InternalHigh > 0) {
977 req->u.io.overlapped.InternalHigh,
978 &
handle->tcp.conn.read_buffer);
980 if (
req->u.io.overlapped.InternalHigh <
handle->tcp.conn.read_buffer.len) {
1003 if (
buf.base == NULL ||
buf.len == 0) {
1007 assert(
buf.base != NULL);
1010 if (WSARecv(
handle->socket,
1016 NULL) != SOCKET_ERROR) {
1033 err = WSAGetLastError();
1034 if (
err == WSAEWOULDBLOCK) {
1042 if (
err == WSAECONNABORTED) {
1045 err = WSAECONNRESET;
1072 assert(
handle->type == UV_TCP);
1074 assert(
handle->write_queue_size >=
req->u.io.queued_bytes);
1075 handle->write_queue_size -=
req->u.io.queued_bytes;
1081 UnregisterWait(
req->wait_handle);
1084 if (
req->event_handle != NULL) {
1085 CloseHandle(
req->event_handle);
1086 req->event_handle = NULL;
1092 if (
err == UV_ECONNABORTED) {
1099 handle->stream.conn.write_reqs_pending--;
1100 if (
handle->stream.conn.shutdown_req != NULL &&
1101 handle->stream.conn.write_reqs_pending == 0) {
1111 uv_tcp_accept_t*
req = (uv_tcp_accept_t*) raw_req;
1114 assert(
handle->type == UV_TCP);
1119 if (
req->accept_socket == INVALID_SOCKET) {
1123 if (
handle->stream.serv.connection_cb) {
1130 setsockopt(
req->accept_socket,
1132 SO_UPDATE_ACCEPT_CONTEXT,
1134 sizeof(
handle->socket)) == 0) {
1135 req->next_pending =
handle->tcp.serv.pending_accepts;
1139 if (
handle->stream.serv.connection_cb) {
1147 req->accept_socket = INVALID_SOCKET;
1161 assert(
handle->type == UV_TCP);
1169 err = ERROR_OPERATION_ABORTED;
1170 }
else if (setsockopt(
handle->socket,
1177 loop->active_tcp_streams++;
1179 err = WSAGetLastError();
1204 return ERROR_NOT_SUPPORTED;
1206 if (
handle->delayed_error == 0 &&
1208 handle->delayed_error = WSAGetLastError();
1214 return WSAGetLastError();
1234 socket = WSASocketW(FROM_PROTOCOL_INFO,
1239 WSA_FLAG_OVERLAPPED);
1241 if (
socket == INVALID_SOCKET) {
1242 return WSAGetLastError();
1260 tcp->loop->active_tcp_streams++;
1268 if (
handle->socket != INVALID_SOCKET) {
1287 if (
handle->socket != INVALID_SOCKET) {
1365 if (!CancelIo((HANDLE)
socket)) {
1366 return GetLastError();
1382 shutdown(
tcp->socket, SD_SEND);
1398 tcp->tcp.serv.accept_reqs != NULL) {
1411 uv_tcp_accept_t*
req = &
tcp->tcp.serv.accept_reqs[
i];
1412 if (
req->accept_socket != INVALID_SOCKET &&
1413 !HasOverlappedIoCompleted(&
req->u.io.overlapped)) {
1415 req->accept_socket = INVALID_SOCKET;
1433 tcp->socket = INVALID_SOCKET;
1440 if (
tcp->reqs_pending == 0) {
1447 WSAPROTOCOL_INFOW protocol_info;
1450 struct sockaddr_storage saddr;
1454 opt_len = (
int)
sizeof protocol_info;
1455 if (getsockopt(sock,
1458 (
char*) &protocol_info,
1459 &opt_len) == SOCKET_ERROR) {
1466 protocol_info.iAddressFamily,
1473 saddr_len =
sizeof(saddr);
1477 saddr_len =
sizeof(saddr);
1493 const struct sockaddr*
addr,
1494 unsigned int addrlen,
1495 unsigned int flags) {
1511 const struct sockaddr*
addr,
1512 unsigned int addrlen,