1 /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. 2 * 3 * Permission is hereby granted, free of charge, to any person obtaining a copy 4 * of this software and associated documentation files (the "Software"), to 5 * deal in the Software without restriction, including without limitation the 6 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 7 * sell copies of the Software, and to permit persons to whom the Software is 8 * furnished to do so, subject to the following conditions: 9 * 10 * The above copyright notice and this permission notice shall be included in 11 * all copies or substantial portions of the Software. 12 * 13 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 18 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 19 * IN THE SOFTWARE. 20 */ 21 22 #include <assert.h> 23 #include <stdlib.h> 24 25 #include "uv.h" 26 #include "internal.h" 27 #include "handle-inl.h" 28 #include "stream-inl.h" 29 #include "req-inl.h" 30 31 32 /* 33 * Number of simultaneous pending AcceptEx calls. 34 */ 35 const unsigned int uv_simultaneous_server_accepts = 32; 36 37 /* A zero-size buffer for use by uv_tcp_read */ 38 static char uv_zero_[] = ""; 39 40 static int uv__tcp_nodelay(uv_tcp_t* handle, SOCKET socket, int enable) { 41 if (setsockopt(socket, 42 IPPROTO_TCP, 43 TCP_NODELAY, 44 (const char*)&enable, 45 sizeof enable) == -1) { 46 return WSAGetLastError(); 47 } 48 return 0; 49 } 50 51 52 static int uv__tcp_keepalive(uv_tcp_t* handle, SOCKET socket, int enable, unsigned int delay) { 53 if (setsockopt(socket, 54 SOL_SOCKET, 55 SO_KEEPALIVE, 56 (const char*)&enable, 57 sizeof enable) == -1) { 58 return WSAGetLastError(); 59 } 60 61 if (!enable) 62 return 0; 63 64 if (delay < 1) 65 return UV_EINVAL; 66 67 if (setsockopt(socket, 68 IPPROTO_TCP, 69 TCP_KEEPALIVE, 70 (const char*)&delay, 71 sizeof delay) == -1) { 72 return WSAGetLastError(); 73 } 74 75 return 0; 76 } 77 78 79 static int uv__tcp_set_socket(uv_loop_t* loop, 80 uv_tcp_t* handle, 81 SOCKET socket, 82 int family, 83 int imported) { 84 DWORD yes = 1; 85 int non_ifs_lsp; 86 int err; 87 88 if (handle->socket != INVALID_SOCKET) 89 return UV_EBUSY; 90 91 /* Set the socket to nonblocking mode */ 92 if (ioctlsocket(socket, FIONBIO, &yes) == SOCKET_ERROR) { 93 return WSAGetLastError(); 94 } 95 96 /* Make the socket non-inheritable */ 97 if (!SetHandleInformation((HANDLE) socket, HANDLE_FLAG_INHERIT, 0)) 98 return GetLastError(); 99 100 /* Associate it with the I/O completion port. Use uv_handle_t pointer as 101 * completion key. */ 102 if (CreateIoCompletionPort((HANDLE)socket, 103 loop->iocp, 104 (ULONG_PTR)socket, 105 0) == NULL) { 106 if (imported) { 107 handle->flags |= UV_HANDLE_EMULATE_IOCP; 108 } else { 109 return GetLastError(); 110 } 111 } 112 113 if (family == AF_INET6) { 114 non_ifs_lsp = uv_tcp_non_ifs_lsp_ipv6; 115 } else { 116 non_ifs_lsp = uv_tcp_non_ifs_lsp_ipv4; 117 } 118 119 if (!(handle->flags & UV_HANDLE_EMULATE_IOCP) && !non_ifs_lsp) { 120 UCHAR sfcnm_flags = 121 FILE_SKIP_SET_EVENT_ON_HANDLE | FILE_SKIP_COMPLETION_PORT_ON_SUCCESS; 122 if (!SetFileCompletionNotificationModes((HANDLE) socket, sfcnm_flags)) 123 return GetLastError(); 124 handle->flags |= UV_HANDLE_SYNC_BYPASS_IOCP; 125 } 126 127 if (handle->flags & UV_HANDLE_TCP_NODELAY) { 128 err = uv__tcp_nodelay(handle, socket, 1); 129 if (err) 130 return err; 131 } 132 133 /* TODO: Use stored delay. */ 134 if (handle->flags & UV_HANDLE_TCP_KEEPALIVE) { 135 err = uv__tcp_keepalive(handle, socket, 1, 60); 136 if (err) 137 return err; 138 } 139 140 handle->socket = socket; 141 142 if (family == AF_INET6) { 143 handle->flags |= UV_HANDLE_IPV6; 144 } else { 145 assert(!(handle->flags & UV_HANDLE_IPV6)); 146 } 147 148 return 0; 149 } 150 151 152 int uv_tcp_init_ex(uv_loop_t* loop, uv_tcp_t* handle, unsigned int flags) { 153 int domain; 154 155 /* Use the lower 8 bits for the domain */ 156 domain = flags & 0xFF; 157 if (domain != AF_INET && domain != AF_INET6 && domain != AF_UNSPEC) 158 return UV_EINVAL; 159 160 if (flags & ~0xFF) 161 return UV_EINVAL; 162 163 uv__stream_init(loop, (uv_stream_t*) handle, UV_TCP); 164 handle->tcp.serv.accept_reqs = NULL; 165 handle->tcp.serv.pending_accepts = NULL; 166 handle->socket = INVALID_SOCKET; 167 handle->reqs_pending = 0; 168 handle->tcp.serv.func_acceptex = NULL; 169 handle->tcp.conn.func_connectex = NULL; 170 handle->tcp.serv.processed_accepts = 0; 171 handle->delayed_error = 0; 172 173 /* If anything fails beyond this point we need to remove the handle from 174 * the handle queue, since it was added by uv__handle_init in uv__stream_init. 175 */ 176 177 if (domain != AF_UNSPEC) { 178 SOCKET sock; 179 DWORD err; 180 181 sock = socket(domain, SOCK_STREAM, 0); 182 if (sock == INVALID_SOCKET) { 183 err = WSAGetLastError(); 184 uv__queue_remove(&handle->handle_queue); 185 return uv_translate_sys_error(err); 186 } 187 188 err = uv__tcp_set_socket(handle->loop, handle, sock, domain, 0); 189 if (err) { 190 closesocket(sock); 191 uv__queue_remove(&handle->handle_queue); 192 return uv_translate_sys_error(err); 193 } 194 195 } 196 197 return 0; 198 } 199 200 201 int uv_tcp_init(uv_loop_t* loop, uv_tcp_t* handle) { 202 return uv_tcp_init_ex(loop, handle, AF_UNSPEC); 203 } 204 205 206 void uv__process_tcp_shutdown_req(uv_loop_t* loop, uv_tcp_t* stream, uv_shutdown_t *req) { 207 int err; 208 209 assert(req); 210 assert(stream->stream.conn.write_reqs_pending == 0); 211 assert(!(stream->flags & UV_HANDLE_SHUT)); 212 assert(stream->flags & UV_HANDLE_CONNECTION); 213 214 stream->stream.conn.shutdown_req = NULL; 215 UNREGISTER_HANDLE_REQ(loop, stream); 216 217 err = 0; 218 if (stream->flags & UV_HANDLE_CLOSING) 219 /* The user destroyed the stream before we got to do the shutdown. */ 220 err = UV_ECANCELED; 221 else if (shutdown(stream->socket, SD_SEND) == SOCKET_ERROR) 222 err = uv_translate_sys_error(WSAGetLastError()); 223 else /* Success. */ 224 stream->flags |= UV_HANDLE_SHUT; 225 226 if (req->cb) 227 req->cb(req, err); 228 229 DECREASE_PENDING_REQ_COUNT(stream); 230 } 231 232 233 void uv__tcp_endgame(uv_loop_t* loop, uv_tcp_t* handle) { 234 unsigned int i; 235 uv_tcp_accept_t* req; 236 237 assert(handle->flags & UV_HANDLE_CLOSING); 238 assert(handle->reqs_pending == 0); 239 assert(!(handle->flags & UV_HANDLE_CLOSED)); 240 assert(handle->socket == INVALID_SOCKET); 241 242 if (!(handle->flags & UV_HANDLE_CONNECTION) && handle->tcp.serv.accept_reqs) { 243 if (handle->flags & UV_HANDLE_EMULATE_IOCP) { 244 for (i = 0; i < uv_simultaneous_server_accepts; i++) { 245 req = &handle->tcp.serv.accept_reqs[i]; 246 if (req->wait_handle != INVALID_HANDLE_VALUE) { 247 UnregisterWait(req->wait_handle); 248 req->wait_handle = INVALID_HANDLE_VALUE; 249 } 250 if (req->event_handle != NULL) { 251 CloseHandle(req->event_handle); 252 req->event_handle = NULL; 253 } 254 } 255 } 256 257 uv__free(handle->tcp.serv.accept_reqs); 258 handle->tcp.serv.accept_reqs = NULL; 259 } 260 261 if (handle->flags & UV_HANDLE_CONNECTION && 262 handle->flags & UV_HANDLE_EMULATE_IOCP) { 263 if (handle->read_req.wait_handle != INVALID_HANDLE_VALUE) { 264 UnregisterWait(handle->read_req.wait_handle); 265 handle->read_req.wait_handle = INVALID_HANDLE_VALUE; 266 } 267 if (handle->read_req.event_handle != NULL) { 268 CloseHandle(handle->read_req.event_handle); 269 handle->read_req.event_handle = NULL; 270 } 271 } 272 273 uv__handle_close(handle); 274 } 275 276 277 /* Unlike on Unix, here we don't set SO_REUSEADDR, because it doesn't just 278 * allow binding to addresses that are in use by sockets in TIME_WAIT, it 279 * effectively allows 'stealing' a port which is in use by another application. 280 * 281 * SO_EXCLUSIVEADDRUSE is also not good here because it does check all sockets, 282 * regardless of state, so we'd get an error even if the port is in use by a 283 * socket in TIME_WAIT state. 284 * 285 * See issue #1360. 286 * 287 */ 288 static int uv__tcp_try_bind(uv_tcp_t* handle, 289 const struct sockaddr* addr, 290 unsigned int addrlen, 291 unsigned int flags) { 292 DWORD err; 293 int r; 294 295 /* There is no SO_REUSEPORT on Windows, Windows only knows SO_REUSEADDR. 296 * so we just return an error directly when UV_TCP_REUSEPORT is requested 297 * for binding the socket. */ 298 if (flags & UV_TCP_REUSEPORT) 299 return ERROR_NOT_SUPPORTED; 300 301 if (handle->socket == INVALID_SOCKET) { 302 SOCKET sock; 303 304 /* Cannot set IPv6-only mode on non-IPv6 socket. */ 305 if ((flags & UV_TCP_IPV6ONLY) && addr->sa_family != AF_INET6) 306 return ERROR_INVALID_PARAMETER; 307 308 sock = socket(addr->sa_family, SOCK_STREAM, 0); 309 if (sock == INVALID_SOCKET) { 310 return WSAGetLastError(); 311 } 312 313 err = uv__tcp_set_socket(handle->loop, handle, sock, addr->sa_family, 0); 314 if (err) { 315 closesocket(sock); 316 return err; 317 } 318 } 319 320 #ifdef IPV6_V6ONLY 321 if (addr->sa_family == AF_INET6) { 322 int on; 323 324 on = (flags & UV_TCP_IPV6ONLY) != 0; 325 326 /* TODO: how to handle errors? This may fail if there is no ipv4 stack 327 * available, or when run on XP/2003 which have no support for dualstack 328 * sockets. For now we're silently ignoring the error. */ 329 setsockopt(handle->socket, 330 IPPROTO_IPV6, 331 IPV6_V6ONLY, 332 (const char*)&on, 333 sizeof on); 334 } 335 #endif 336 337 r = bind(handle->socket, addr, addrlen); 338 339 if (r == SOCKET_ERROR) { 340 err = WSAGetLastError(); 341 if (err == WSAEADDRINUSE) { 342 /* Some errors are not to be reported until connect() or listen() */ 343 handle->delayed_error = err; 344 } else { 345 return err; 346 } 347 } 348 349 handle->flags |= UV_HANDLE_BOUND; 350 351 return 0; 352 } 353 354 355 static void CALLBACK post_completion(void* context, BOOLEAN timed_out) { 356 uv_req_t* req; 357 uv_tcp_t* handle; 358 359 req = (uv_req_t*) context; 360 assert(req != NULL); 361 handle = (uv_tcp_t*)req->data; 362 assert(handle != NULL); 363 assert(!timed_out); 364 365 if (!PostQueuedCompletionStatus(handle->loop->iocp, 366 req->u.io.overlapped.InternalHigh, 367 0, 368 &req->u.io.overlapped)) { 369 uv_fatal_error(GetLastError(), "PostQueuedCompletionStatus"); 370 } 371 } 372 373 374 static void CALLBACK post_write_completion(void* context, BOOLEAN timed_out) { 375 uv_write_t* req; 376 uv_tcp_t* handle; 377 378 req = (uv_write_t*) context; 379 assert(req != NULL); 380 handle = (uv_tcp_t*)req->handle; 381 assert(handle != NULL); 382 assert(!timed_out); 383 384 if (!PostQueuedCompletionStatus(handle->loop->iocp, 385 req->u.io.overlapped.InternalHigh, 386 0, 387 &req->u.io.overlapped)) { 388 uv_fatal_error(GetLastError(), "PostQueuedCompletionStatus"); 389 } 390 } 391 392 393 static void uv__tcp_queue_accept(uv_tcp_t* handle, uv_tcp_accept_t* req) { 394 uv_loop_t* loop = handle->loop; 395 BOOL success; 396 DWORD bytes; 397 SOCKET accept_socket; 398 short family; 399 400 assert(handle->flags & UV_HANDLE_LISTENING); 401 assert(req->accept_socket == INVALID_SOCKET); 402 403 /* choose family and extension function */ 404 if (handle->flags & UV_HANDLE_IPV6) { 405 family = AF_INET6; 406 } else { 407 family = AF_INET; 408 } 409 410 /* Open a socket for the accepted connection. */ 411 accept_socket = socket(family, SOCK_STREAM, 0); 412 if (accept_socket == INVALID_SOCKET) { 413 SET_REQ_ERROR(req, WSAGetLastError()); 414 uv__insert_pending_req(loop, (uv_req_t*)req); 415 handle->reqs_pending++; 416 return; 417 } 418 419 /* Make the socket non-inheritable */ 420 if (!SetHandleInformation((HANDLE) accept_socket, HANDLE_FLAG_INHERIT, 0)) { 421 SET_REQ_ERROR(req, GetLastError()); 422 uv__insert_pending_req(loop, (uv_req_t*)req); 423 handle->reqs_pending++; 424 closesocket(accept_socket); 425 return; 426 } 427 428 /* Prepare the overlapped structure. */ 429 memset(&(req->u.io.overlapped), 0, sizeof(req->u.io.overlapped)); 430 if (handle->flags & UV_HANDLE_EMULATE_IOCP) { 431 assert(req->event_handle != NULL); 432 req->u.io.overlapped.hEvent = (HANDLE) ((ULONG_PTR) req->event_handle | 1); 433 } 434 435 success = handle->tcp.serv.func_acceptex(handle->socket, 436 accept_socket, 437 (void*)req->accept_buffer, 438 0, 439 sizeof(struct sockaddr_storage), 440 sizeof(struct sockaddr_storage), 441 &bytes, 442 &req->u.io.overlapped); 443 444 if (UV_SUCCEEDED_WITHOUT_IOCP(success)) { 445 /* Process the req without IOCP. */ 446 req->accept_socket = accept_socket; 447 handle->reqs_pending++; 448 uv__insert_pending_req(loop, (uv_req_t*)req); 449 } else if (UV_SUCCEEDED_WITH_IOCP(success)) { 450 /* The req will be processed with IOCP. */ 451 req->accept_socket = accept_socket; 452 handle->reqs_pending++; 453 if (handle->flags & UV_HANDLE_EMULATE_IOCP && 454 req->wait_handle == INVALID_HANDLE_VALUE && 455 !RegisterWaitForSingleObject(&req->wait_handle, 456 req->event_handle, post_completion, (void*) req, 457 INFINITE, WT_EXECUTEINWAITTHREAD)) { 458 SET_REQ_ERROR(req, GetLastError()); 459 uv__insert_pending_req(loop, (uv_req_t*)req); 460 } 461 } else { 462 /* Make this req pending reporting an error. */ 463 SET_REQ_ERROR(req, WSAGetLastError()); 464 uv__insert_pending_req(loop, (uv_req_t*)req); 465 handle->reqs_pending++; 466 /* Destroy the preallocated client socket. */ 467 closesocket(accept_socket); 468 /* Destroy the event handle */ 469 if (handle->flags & UV_HANDLE_EMULATE_IOCP) { 470 CloseHandle(req->event_handle); 471 req->event_handle = NULL; 472 } 473 } 474 } 475 476 477 static void uv__tcp_queue_read(uv_loop_t* loop, uv_tcp_t* handle) { 478 uv_read_t* req; 479 uv_buf_t buf; 480 int result; 481 DWORD bytes, flags; 482 483 assert(handle->flags & UV_HANDLE_READING); 484 assert(!(handle->flags & UV_HANDLE_READ_PENDING)); 485 486 req = &handle->read_req; 487 memset(&req->u.io.overlapped, 0, sizeof(req->u.io.overlapped)); 488 489 handle->flags |= UV_HANDLE_ZERO_READ; 490 buf.base = (char*) &uv_zero_; 491 buf.len = 0; 492 493 /* Prepare the overlapped structure. */ 494 memset(&(req->u.io.overlapped), 0, sizeof(req->u.io.overlapped)); 495 if (handle->flags & UV_HANDLE_EMULATE_IOCP) { 496 assert(req->event_handle != NULL); 497 req->u.io.overlapped.hEvent = (HANDLE) ((ULONG_PTR) req->event_handle | 1); 498 } 499 500 flags = 0; 501 result = WSARecv(handle->socket, 502 (WSABUF*)&buf, 503 1, 504 &bytes, 505 &flags, 506 &req->u.io.overlapped, 507 NULL); 508 509 handle->flags |= UV_HANDLE_READ_PENDING; 510 handle->reqs_pending++; 511 512 if (UV_SUCCEEDED_WITHOUT_IOCP(result == 0)) { 513 /* Process the req without IOCP. */ 514 req->u.io.overlapped.InternalHigh = bytes; 515 uv__insert_pending_req(loop, (uv_req_t*)req); 516 } else if (UV_SUCCEEDED_WITH_IOCP(result == 0)) { 517 /* The req will be processed with IOCP. */ 518 if (handle->flags & UV_HANDLE_EMULATE_IOCP && 519 req->wait_handle == INVALID_HANDLE_VALUE && 520 !RegisterWaitForSingleObject(&req->wait_handle, 521 req->event_handle, post_completion, (void*) req, 522 INFINITE, WT_EXECUTEINWAITTHREAD)) { 523 SET_REQ_ERROR(req, GetLastError()); 524 uv__insert_pending_req(loop, (uv_req_t*)req); 525 } 526 } else { 527 /* Make this req pending reporting an error. */ 528 SET_REQ_ERROR(req, WSAGetLastError()); 529 uv__insert_pending_req(loop, (uv_req_t*)req); 530 } 531 } 532 533 534 int uv_tcp_close_reset(uv_tcp_t* handle, uv_close_cb close_cb) { 535 struct linger l = { 1, 0 }; 536 537 /* Disallow setting SO_LINGER to zero due to some platform inconsistencies */ 538 if (uv__is_stream_shutting(handle)) 539 return UV_EINVAL; 540 541 if (0 != setsockopt(handle->socket, SOL_SOCKET, SO_LINGER, (const char*)&l, sizeof(l))) 542 return uv_translate_sys_error(WSAGetLastError()); 543 544 uv_close((uv_handle_t*) handle, close_cb); 545 return 0; 546 } 547 548 549 int uv__tcp_listen(uv_tcp_t* handle, int backlog, uv_connection_cb cb) { 550 unsigned int i, simultaneous_accepts; 551 uv_tcp_accept_t* req; 552 int err; 553 554 assert(backlog > 0); 555 556 if (handle->flags & UV_HANDLE_LISTENING) { 557 handle->stream.serv.connection_cb = cb; 558 } 559 560 if (handle->flags & UV_HANDLE_READING) { 561 return WSAEISCONN; 562 } 563 564 if (handle->delayed_error) { 565 return handle->delayed_error; 566 } 567 568 if (!(handle->flags & UV_HANDLE_BOUND)) { 569 err = uv__tcp_try_bind(handle, 570 (const struct sockaddr*) &uv_addr_ip4_any_, 571 sizeof(uv_addr_ip4_any_), 572 0); 573 if (err) 574 return err; 575 if (handle->delayed_error) 576 return handle->delayed_error; 577 } 578 579 if (!handle->tcp.serv.func_acceptex) { 580 if (!uv__get_acceptex_function(handle->socket, &handle->tcp.serv.func_acceptex)) { 581 return WSAEAFNOSUPPORT; 582 } 583 } 584 585 /* If this flag is set, we already made this listen call in xfer. */ 586 if (!(handle->flags & UV_HANDLE_SHARED_TCP_SOCKET) && 587 listen(handle->socket, backlog) == SOCKET_ERROR) { 588 return WSAGetLastError(); 589 } 590 591 handle->flags |= UV_HANDLE_LISTENING; 592 handle->stream.serv.connection_cb = cb; 593 INCREASE_ACTIVE_COUNT(loop, handle); 594 595 simultaneous_accepts = handle->flags & UV_HANDLE_TCP_SINGLE_ACCEPT ? 1 596 : uv_simultaneous_server_accepts; 597 598 if (handle->tcp.serv.accept_reqs == NULL) { 599 handle->tcp.serv.accept_reqs = 600 uv__malloc(uv_simultaneous_server_accepts * sizeof(uv_tcp_accept_t)); 601 if (!handle->tcp.serv.accept_reqs) { 602 uv_fatal_error(ERROR_OUTOFMEMORY, "uv__malloc"); 603 } 604 605 for (i = 0; i < simultaneous_accepts; i++) { 606 req = &handle->tcp.serv.accept_reqs[i]; 607 UV_REQ_INIT(req, UV_ACCEPT); 608 req->accept_socket = INVALID_SOCKET; 609 req->data = handle; 610 611 req->wait_handle = INVALID_HANDLE_VALUE; 612 if (handle->flags & UV_HANDLE_EMULATE_IOCP) { 613 req->event_handle = CreateEvent(NULL, 0, 0, NULL); 614 if (req->event_handle == NULL) { 615 uv_fatal_error(GetLastError(), "CreateEvent"); 616 } 617 } else { 618 req->event_handle = NULL; 619 } 620 621 uv__tcp_queue_accept(handle, req); 622 } 623 624 /* Initialize other unused requests too, because uv_tcp_endgame doesn't 625 * know how many requests were initialized, so it will try to clean up 626 * {uv_simultaneous_server_accepts} requests. */ 627 for (i = simultaneous_accepts; i < uv_simultaneous_server_accepts; i++) { 628 req = &handle->tcp.serv.accept_reqs[i]; 629 UV_REQ_INIT(req, UV_ACCEPT); 630 req->accept_socket = INVALID_SOCKET; 631 req->data = handle; 632 req->wait_handle = INVALID_HANDLE_VALUE; 633 req->event_handle = NULL; 634 } 635 } 636 637 return 0; 638 } 639 640 641 int uv__tcp_accept(uv_tcp_t* server, uv_tcp_t* client) { 642 int err = 0; 643 int family; 644 645 uv_tcp_accept_t* req = server->tcp.serv.pending_accepts; 646 647 if (!req) { 648 /* No valid connections found, so we error out. */ 649 return WSAEWOULDBLOCK; 650 } 651 652 if (req->accept_socket == INVALID_SOCKET) { 653 return WSAENOTCONN; 654 } 655 656 if (server->flags & UV_HANDLE_IPV6) { 657 family = AF_INET6; 658 } else { 659 family = AF_INET; 660 } 661 662 err = uv__tcp_set_socket(client->loop, 663 client, 664 req->accept_socket, 665 family, 666 0); 667 if (err) { 668 closesocket(req->accept_socket); 669 } else { 670 uv__connection_init((uv_stream_t*) client); 671 /* AcceptEx() implicitly binds the accepted socket. */ 672 client->flags |= UV_HANDLE_BOUND | UV_HANDLE_READABLE | UV_HANDLE_WRITABLE; 673 } 674 675 /* Prepare the req to pick up a new connection */ 676 server->tcp.serv.pending_accepts = req->next_pending; 677 req->next_pending = NULL; 678 req->accept_socket = INVALID_SOCKET; 679 680 if (!(server->flags & UV_HANDLE_CLOSING)) { 681 /* Check if we're in a middle of changing the number of pending accepts. */ 682 if (!(server->flags & UV_HANDLE_TCP_ACCEPT_STATE_CHANGING)) { 683 uv__tcp_queue_accept(server, req); 684 } else { 685 /* We better be switching to a single pending accept. */ 686 assert(server->flags & UV_HANDLE_TCP_SINGLE_ACCEPT); 687 688 server->tcp.serv.processed_accepts++; 689 690 if (server->tcp.serv.processed_accepts >= uv_simultaneous_server_accepts) { 691 server->tcp.serv.processed_accepts = 0; 692 /* 693 * All previously queued accept requests are now processed. 694 * We now switch to queueing just a single accept. 695 */ 696 uv__tcp_queue_accept(server, &server->tcp.serv.accept_reqs[0]); 697 server->flags &= ~UV_HANDLE_TCP_ACCEPT_STATE_CHANGING; 698 server->flags |= UV_HANDLE_TCP_SINGLE_ACCEPT; 699 } 700 } 701 } 702 703 return err; 704 } 705 706 707 int uv__tcp_read_start(uv_tcp_t* handle, uv_alloc_cb alloc_cb, 708 uv_read_cb read_cb) { 709 uv_loop_t* loop = handle->loop; 710 711 handle->flags |= UV_HANDLE_READING; 712 handle->read_cb = read_cb; 713 handle->alloc_cb = alloc_cb; 714 INCREASE_ACTIVE_COUNT(loop, handle); 715 716 /* If reading was stopped and then started again, there could still be a read 717 * request pending. */ 718 if (!(handle->flags & UV_HANDLE_READ_PENDING)) { 719 if (handle->flags & UV_HANDLE_EMULATE_IOCP && 720 handle->read_req.event_handle == NULL) { 721 handle->read_req.event_handle = CreateEvent(NULL, 0, 0, NULL); 722 if (handle->read_req.event_handle == NULL) { 723 uv_fatal_error(GetLastError(), "CreateEvent"); 724 } 725 } 726 uv__tcp_queue_read(loop, handle); 727 } 728 729 return 0; 730 } 731 732 static int uv__is_loopback(const struct sockaddr_storage* storage) { 733 const struct sockaddr_in* in4; 734 const struct sockaddr_in6* in6; 735 int i; 736 737 if (storage->ss_family == AF_INET) { 738 in4 = (const struct sockaddr_in*) storage; 739 return in4->sin_addr.S_un.S_un_b.s_b1 == 127; 740 } 741 if (storage->ss_family == AF_INET6) { 742 in6 = (const struct sockaddr_in6*) storage; 743 for (i = 0; i < 7; ++i) { 744 if (in6->sin6_addr.u.Word[i] != 0) 745 return 0; 746 } 747 return in6->sin6_addr.u.Word[7] == htons(1); 748 } 749 return 0; 750 } 751 752 // Check if Windows version is 10.0.16299 or later 753 static int uv__is_fast_loopback_fail_supported(void) { 754 OSVERSIONINFOW os_info; 755 if (!pRtlGetVersion) 756 return 0; 757 pRtlGetVersion(&os_info); 758 if (os_info.dwMajorVersion < 10) 759 return 0; 760 if (os_info.dwMajorVersion > 10) 761 return 1; 762 if (os_info.dwMinorVersion > 0) 763 return 1; 764 return os_info.dwBuildNumber >= 16299; 765 } 766 767 static int uv__tcp_try_connect(uv_connect_t* req, 768 uv_tcp_t* handle, 769 const struct sockaddr* addr, 770 unsigned int addrlen, 771 uv_connect_cb cb) { 772 uv_loop_t* loop = handle->loop; 773 TCP_INITIAL_RTO_PARAMETERS retransmit_ioctl; 774 const struct sockaddr* bind_addr; 775 struct sockaddr_storage converted; 776 BOOL success; 777 DWORD bytes; 778 int err; 779 780 err = uv__convert_to_localhost_if_unspecified(addr, &converted); 781 if (err) 782 return err; 783 784 if (handle->delayed_error != 0) 785 goto out; 786 787 if (!(handle->flags & UV_HANDLE_BOUND)) { 788 if (addrlen == sizeof(uv_addr_ip4_any_)) { 789 bind_addr = (const struct sockaddr*) &uv_addr_ip4_any_; 790 } else if (addrlen == sizeof(uv_addr_ip6_any_)) { 791 bind_addr = (const struct sockaddr*) &uv_addr_ip6_any_; 792 } else { 793 abort(); 794 } 795 err = uv__tcp_try_bind(handle, bind_addr, addrlen, 0); 796 if (err) 797 return err; 798 if (handle->delayed_error != 0) 799 goto out; 800 } 801 802 if (!handle->tcp.conn.func_connectex) { 803 if (!uv__get_connectex_function(handle->socket, &handle->tcp.conn.func_connectex)) { 804 return WSAEAFNOSUPPORT; 805 } 806 } 807 808 /* This makes connect() fail instantly if the target port on the localhost 809 * is not reachable, instead of waiting for 2s. We do not care if this fails. 810 * This only works on Windows version 10.0.16299 and later. 811 */ 812 if (uv__is_fast_loopback_fail_supported() && uv__is_loopback(&converted)) { 813 memset(&retransmit_ioctl, 0, sizeof(retransmit_ioctl)); 814 retransmit_ioctl.Rtt = TCP_INITIAL_RTO_NO_SYN_RETRANSMISSIONS; 815 retransmit_ioctl.MaxSynRetransmissions = TCP_INITIAL_RTO_NO_SYN_RETRANSMISSIONS; 816 WSAIoctl(handle->socket, 817 SIO_TCP_INITIAL_RTO, 818 &retransmit_ioctl, 819 sizeof(retransmit_ioctl), 820 NULL, 821 0, 822 &bytes, 823 NULL, 824 NULL); 825 } 826 827 out: 828 829 UV_REQ_INIT(req, UV_CONNECT); 830 req->handle = (uv_stream_t*) handle; 831 req->cb = cb; 832 memset(&req->u.io.overlapped, 0, sizeof(req->u.io.overlapped)); 833 834 if (handle->delayed_error != 0) { 835 /* Process the req without IOCP. */ 836 handle->reqs_pending++; 837 REGISTER_HANDLE_REQ(loop, handle); 838 uv__insert_pending_req(loop, (uv_req_t*)req); 839 return 0; 840 } 841 842 success = handle->tcp.conn.func_connectex(handle->socket, 843 (const struct sockaddr*) &converted, 844 addrlen, 845 NULL, 846 0, 847 &bytes, 848 &req->u.io.overlapped); 849 850 if (UV_SUCCEEDED_WITHOUT_IOCP(success)) { 851 /* Process the req without IOCP. */ 852 handle->reqs_pending++; 853 REGISTER_HANDLE_REQ(loop, handle); 854 uv__insert_pending_req(loop, (uv_req_t*)req); 855 } else if (UV_SUCCEEDED_WITH_IOCP(success)) { 856 /* The req will be processed with IOCP. */ 857 handle->reqs_pending++; 858 REGISTER_HANDLE_REQ(loop, handle); 859 } else { 860 return WSAGetLastError(); 861 } 862 863 return 0; 864 } 865 866 867 int uv_tcp_getsockname(const uv_tcp_t* handle, 868 struct sockaddr* name, 869 int* namelen) { 870 871 return uv__getsockpeername((const uv_handle_t*) handle, 872 getsockname, 873 name, 874 namelen, 875 handle->delayed_error); 876 } 877 878 879 int uv_tcp_getpeername(const uv_tcp_t* handle, 880 struct sockaddr* name, 881 int* namelen) { 882 883 return uv__getsockpeername((const uv_handle_t*) handle, 884 getpeername, 885 name, 886 namelen, 887 handle->delayed_error); 888 } 889 890 891 int uv__tcp_write(uv_loop_t* loop, 892 uv_write_t* req, 893 uv_tcp_t* handle, 894 const uv_buf_t bufs[], 895 unsigned int nbufs, 896 uv_write_cb cb) { 897 int result; 898 DWORD bytes; 899 900 UV_REQ_INIT(req, UV_WRITE); 901 req->handle = (uv_stream_t*) handle; 902 req->cb = cb; 903 904 /* Prepare the overlapped structure. */ 905 memset(&(req->u.io.overlapped), 0, sizeof(req->u.io.overlapped)); 906 if (handle->flags & UV_HANDLE_EMULATE_IOCP) { 907 req->event_handle = CreateEvent(NULL, 0, 0, NULL); 908 if (req->event_handle == NULL) { 909 uv_fatal_error(GetLastError(), "CreateEvent"); 910 } 911 req->u.io.overlapped.hEvent = (HANDLE) ((ULONG_PTR) req->event_handle | 1); 912 req->wait_handle = INVALID_HANDLE_VALUE; 913 } 914 915 result = WSASend(handle->socket, 916 (WSABUF*) bufs, 917 nbufs, 918 &bytes, 919 0, 920 &req->u.io.overlapped, 921 NULL); 922 923 if (UV_SUCCEEDED_WITHOUT_IOCP(result == 0)) { 924 /* Request completed immediately. */ 925 req->u.io.queued_bytes = 0; 926 handle->reqs_pending++; 927 handle->stream.conn.write_reqs_pending++; 928 REGISTER_HANDLE_REQ(loop, handle); 929 uv__insert_pending_req(loop, (uv_req_t*) req); 930 } else if (UV_SUCCEEDED_WITH_IOCP(result == 0)) { 931 /* Request queued by the kernel. */ 932 req->u.io.queued_bytes = uv__count_bufs(bufs, nbufs); 933 handle->reqs_pending++; 934 handle->stream.conn.write_reqs_pending++; 935 REGISTER_HANDLE_REQ(loop, handle); 936 handle->write_queue_size += req->u.io.queued_bytes; 937 if (handle->flags & UV_HANDLE_EMULATE_IOCP && 938 !RegisterWaitForSingleObject(&req->wait_handle, 939 req->event_handle, post_write_completion, (void*) req, 940 INFINITE, WT_EXECUTEINWAITTHREAD | WT_EXECUTEONLYONCE)) { 941 SET_REQ_ERROR(req, GetLastError()); 942 uv__insert_pending_req(loop, (uv_req_t*)req); 943 } 944 } else { 945 /* Send failed due to an error, report it later */ 946 req->u.io.queued_bytes = 0; 947 handle->reqs_pending++; 948 handle->stream.conn.write_reqs_pending++; 949 REGISTER_HANDLE_REQ(loop, handle); 950 SET_REQ_ERROR(req, WSAGetLastError()); 951 uv__insert_pending_req(loop, (uv_req_t*) req); 952 } 953 954 return 0; 955 } 956 957 958 int uv__tcp_try_write(uv_tcp_t* handle, 959 const uv_buf_t bufs[], 960 unsigned int nbufs) { 961 int result; 962 DWORD bytes; 963 964 if (handle->stream.conn.write_reqs_pending > 0) 965 return UV_EAGAIN; 966 967 result = WSASend(handle->socket, 968 (WSABUF*) bufs, 969 nbufs, 970 &bytes, 971 0, 972 NULL, 973 NULL); 974 975 if (result == SOCKET_ERROR) 976 return uv_translate_sys_error(WSAGetLastError()); 977 else 978 return bytes; 979 } 980 981 982 void uv__process_tcp_read_req(uv_loop_t* loop, uv_tcp_t* handle, 983 uv_req_t* req) { 984 DWORD bytes, flags, err; 985 uv_buf_t buf; 986 int count; 987 988 assert(handle->type == UV_TCP); 989 990 handle->flags &= ~UV_HANDLE_READ_PENDING; 991 992 if (!REQ_SUCCESS(req)) { 993 /* An error occurred doing the read. */ 994 if ((handle->flags & UV_HANDLE_READING) || 995 !(handle->flags & UV_HANDLE_ZERO_READ)) { 996 handle->flags &= ~UV_HANDLE_READING; 997 DECREASE_ACTIVE_COUNT(loop, handle); 998 buf = (handle->flags & UV_HANDLE_ZERO_READ) ? 999 uv_buf_init(NULL, 0) : handle->tcp.conn.read_buffer; 1000 1001 err = GET_REQ_SOCK_ERROR(req); 1002 1003 if (err == WSAECONNABORTED) { 1004 /* Turn WSAECONNABORTED into UV_ECONNRESET to be consistent with Unix. 1005 */ 1006 err = WSAECONNRESET; 1007 } 1008 handle->flags &= ~(UV_HANDLE_READABLE | UV_HANDLE_WRITABLE); 1009 1010 handle->read_cb((uv_stream_t*)handle, 1011 uv_translate_sys_error(err), 1012 &buf); 1013 } 1014 } else { 1015 if (!(handle->flags & UV_HANDLE_ZERO_READ)) { 1016 /* The read was done with a non-zero buffer length. */ 1017 if (req->u.io.overlapped.InternalHigh > 0) { 1018 /* Successful read */ 1019 handle->read_cb((uv_stream_t*)handle, 1020 req->u.io.overlapped.InternalHigh, 1021 &handle->tcp.conn.read_buffer); 1022 /* Read again only if bytes == buf.len */ 1023 if (req->u.io.overlapped.InternalHigh < handle->tcp.conn.read_buffer.len) { 1024 goto done; 1025 } 1026 } else { 1027 /* Connection closed */ 1028 if (handle->flags & UV_HANDLE_READING) { 1029 handle->flags &= ~UV_HANDLE_READING; 1030 DECREASE_ACTIVE_COUNT(loop, handle); 1031 } 1032 1033 buf.base = 0; 1034 buf.len = 0; 1035 handle->read_cb((uv_stream_t*)handle, UV_EOF, &handle->tcp.conn.read_buffer); 1036 goto done; 1037 } 1038 } 1039 1040 /* Do nonblocking reads until the buffer is empty */ 1041 count = 32; 1042 while ((handle->flags & UV_HANDLE_READING) && (count-- > 0)) { 1043 buf = uv_buf_init(NULL, 0); 1044 handle->alloc_cb((uv_handle_t*) handle, 65536, &buf); 1045 if (buf.base == NULL || buf.len == 0) { 1046 handle->read_cb((uv_stream_t*) handle, UV_ENOBUFS, &buf); 1047 break; 1048 } 1049 assert(buf.base != NULL); 1050 1051 flags = 0; 1052 if (WSARecv(handle->socket, 1053 (WSABUF*)&buf, 1054 1, 1055 &bytes, 1056 &flags, 1057 NULL, 1058 NULL) != SOCKET_ERROR) { 1059 if (bytes > 0) { 1060 /* Successful read */ 1061 handle->read_cb((uv_stream_t*)handle, bytes, &buf); 1062 /* Read again only if bytes == buf.len */ 1063 if (bytes < buf.len) { 1064 break; 1065 } 1066 } else { 1067 /* Connection closed */ 1068 handle->flags &= ~UV_HANDLE_READING; 1069 DECREASE_ACTIVE_COUNT(loop, handle); 1070 1071 handle->read_cb((uv_stream_t*)handle, UV_EOF, &buf); 1072 break; 1073 } 1074 } else { 1075 err = WSAGetLastError(); 1076 if (err == WSAEWOULDBLOCK) { 1077 /* Read buffer was completely empty, report a 0-byte read. */ 1078 handle->read_cb((uv_stream_t*)handle, 0, &buf); 1079 } else { 1080 /* Ouch! serious error. */ 1081 handle->flags &= ~UV_HANDLE_READING; 1082 DECREASE_ACTIVE_COUNT(loop, handle); 1083 1084 if (err == WSAECONNABORTED) { 1085 /* Turn WSAECONNABORTED into UV_ECONNRESET to be consistent with 1086 * Unix. */ 1087 err = WSAECONNRESET; 1088 } 1089 handle->flags &= ~(UV_HANDLE_READABLE | UV_HANDLE_WRITABLE); 1090 1091 handle->read_cb((uv_stream_t*)handle, 1092 uv_translate_sys_error(err), 1093 &buf); 1094 } 1095 break; 1096 } 1097 } 1098 1099 done: 1100 /* Post another read if still reading and not closing. */ 1101 if ((handle->flags & UV_HANDLE_READING) && 1102 !(handle->flags & UV_HANDLE_READ_PENDING)) { 1103 uv__tcp_queue_read(loop, handle); 1104 } 1105 } 1106 1107 DECREASE_PENDING_REQ_COUNT(handle); 1108 } 1109 1110 1111 void uv__process_tcp_write_req(uv_loop_t* loop, uv_tcp_t* handle, 1112 uv_write_t* req) { 1113 int err; 1114 1115 assert(handle->type == UV_TCP); 1116 1117 assert(handle->write_queue_size >= req->u.io.queued_bytes); 1118 handle->write_queue_size -= req->u.io.queued_bytes; 1119 1120 UNREGISTER_HANDLE_REQ(loop, handle); 1121 1122 if (handle->flags & UV_HANDLE_EMULATE_IOCP) { 1123 if (req->wait_handle != INVALID_HANDLE_VALUE) { 1124 UnregisterWait(req->wait_handle); 1125 req->wait_handle = INVALID_HANDLE_VALUE; 1126 } 1127 if (req->event_handle != NULL) { 1128 CloseHandle(req->event_handle); 1129 req->event_handle = NULL; 1130 } 1131 } 1132 1133 if (req->cb) { 1134 err = uv_translate_sys_error(GET_REQ_SOCK_ERROR(req)); 1135 if (err == UV_ECONNABORTED) { 1136 /* use UV_ECANCELED for consistency with Unix */ 1137 err = UV_ECANCELED; 1138 } 1139 req->cb(req, err); 1140 } 1141 1142 handle->stream.conn.write_reqs_pending--; 1143 if (handle->stream.conn.write_reqs_pending == 0) { 1144 if (handle->flags & UV_HANDLE_CLOSING) { 1145 closesocket(handle->socket); 1146 handle->socket = INVALID_SOCKET; 1147 } 1148 if (uv__is_stream_shutting(handle)) 1149 uv__process_tcp_shutdown_req(loop, 1150 handle, 1151 handle->stream.conn.shutdown_req); 1152 } 1153 1154 DECREASE_PENDING_REQ_COUNT(handle); 1155 } 1156 1157 1158 void uv__process_tcp_accept_req(uv_loop_t* loop, uv_tcp_t* handle, 1159 uv_req_t* raw_req) { 1160 uv_tcp_accept_t* req = (uv_tcp_accept_t*) raw_req; 1161 int err; 1162 1163 assert(handle->type == UV_TCP); 1164 1165 /* If handle->accepted_socket is not a valid socket, then uv_queue_accept 1166 * must have failed. This is a serious error. We stop accepting connections 1167 * and report this error to the connection callback. */ 1168 if (req->accept_socket == INVALID_SOCKET) { 1169 if (handle->flags & UV_HANDLE_LISTENING) { 1170 handle->flags &= ~UV_HANDLE_LISTENING; 1171 DECREASE_ACTIVE_COUNT(loop, handle); 1172 if (handle->stream.serv.connection_cb) { 1173 err = GET_REQ_SOCK_ERROR(req); 1174 handle->stream.serv.connection_cb((uv_stream_t*)handle, 1175 uv_translate_sys_error(err)); 1176 } 1177 } 1178 } else if (REQ_SUCCESS(req) && 1179 setsockopt(req->accept_socket, 1180 SOL_SOCKET, 1181 SO_UPDATE_ACCEPT_CONTEXT, 1182 (char*)&handle->socket, 1183 sizeof(handle->socket)) == 0) { 1184 req->next_pending = handle->tcp.serv.pending_accepts; 1185 handle->tcp.serv.pending_accepts = req; 1186 1187 /* Accept and SO_UPDATE_ACCEPT_CONTEXT were successful. */ 1188 if (handle->stream.serv.connection_cb) { 1189 handle->stream.serv.connection_cb((uv_stream_t*)handle, 0); 1190 } 1191 } else { 1192 /* Error related to accepted socket is ignored because the server socket 1193 * may still be healthy. If the server socket is broken uv_queue_accept 1194 * will detect it. */ 1195 closesocket(req->accept_socket); 1196 req->accept_socket = INVALID_SOCKET; 1197 if (handle->flags & UV_HANDLE_LISTENING) { 1198 uv__tcp_queue_accept(handle, req); 1199 } 1200 } 1201 1202 DECREASE_PENDING_REQ_COUNT(handle); 1203 } 1204 1205 1206 void uv__process_tcp_connect_req(uv_loop_t* loop, uv_tcp_t* handle, 1207 uv_connect_t* req) { 1208 int err; 1209 1210 assert(handle->type == UV_TCP); 1211 1212 UNREGISTER_HANDLE_REQ(loop, handle); 1213 1214 err = 0; 1215 if (handle->delayed_error) { 1216 /* To smooth over the differences between unixes errors that 1217 * were reported synchronously on the first connect can be delayed 1218 * until the next tick--which is now. 1219 */ 1220 err = handle->delayed_error; 1221 handle->delayed_error = 0; 1222 } else if (REQ_SUCCESS(req)) { 1223 if (handle->flags & UV_HANDLE_CLOSING) { 1224 /* use UV_ECANCELED for consistency with Unix */ 1225 err = ERROR_OPERATION_ABORTED; 1226 } else if (setsockopt(handle->socket, 1227 SOL_SOCKET, 1228 SO_UPDATE_CONNECT_CONTEXT, 1229 NULL, 1230 0) == 0) { 1231 uv__connection_init((uv_stream_t*)handle); 1232 handle->flags |= UV_HANDLE_READABLE | UV_HANDLE_WRITABLE; 1233 } else { 1234 err = WSAGetLastError(); 1235 } 1236 } else { 1237 err = GET_REQ_SOCK_ERROR(req); 1238 } 1239 req->cb(req, uv_translate_sys_error(err)); 1240 1241 DECREASE_PENDING_REQ_COUNT(handle); 1242 } 1243 1244 1245 int uv__tcp_xfer_export(uv_tcp_t* handle, 1246 int target_pid, 1247 uv__ipc_socket_xfer_type_t* xfer_type, 1248 uv__ipc_socket_xfer_info_t* xfer_info) { 1249 if (handle->flags & UV_HANDLE_CONNECTION) { 1250 *xfer_type = UV__IPC_SOCKET_XFER_TCP_CONNECTION; 1251 } else { 1252 *xfer_type = UV__IPC_SOCKET_XFER_TCP_SERVER; 1253 /* We're about to share the socket with another process. Because this is a 1254 * listening socket, we assume that the other process will be accepting 1255 * connections on it. Thus, before sharing the socket with another process, 1256 * we call listen here in the parent process. */ 1257 if (!(handle->flags & UV_HANDLE_LISTENING)) { 1258 if (!(handle->flags & UV_HANDLE_BOUND)) { 1259 return ERROR_NOT_SUPPORTED; 1260 } 1261 if (handle->delayed_error == 0 && 1262 listen(handle->socket, SOMAXCONN) == SOCKET_ERROR) { 1263 handle->delayed_error = WSAGetLastError(); 1264 } 1265 } 1266 } 1267 1268 if (WSADuplicateSocketW(handle->socket, target_pid, &xfer_info->socket_info)) 1269 return WSAGetLastError(); 1270 xfer_info->delayed_error = handle->delayed_error; 1271 1272 /* Mark the local copy of the handle as 'shared' so we behave in a way that's 1273 * friendly to the process(es) that we share the socket with. */ 1274 handle->flags |= UV_HANDLE_SHARED_TCP_SOCKET; 1275 1276 return 0; 1277 } 1278 1279 1280 int uv__tcp_xfer_import(uv_tcp_t* tcp, 1281 uv__ipc_socket_xfer_type_t xfer_type, 1282 uv__ipc_socket_xfer_info_t* xfer_info) { 1283 int err; 1284 SOCKET socket; 1285 1286 assert(xfer_type == UV__IPC_SOCKET_XFER_TCP_SERVER || 1287 xfer_type == UV__IPC_SOCKET_XFER_TCP_CONNECTION); 1288 1289 socket = WSASocketW(FROM_PROTOCOL_INFO, 1290 FROM_PROTOCOL_INFO, 1291 FROM_PROTOCOL_INFO, 1292 &xfer_info->socket_info, 1293 0, 1294 WSA_FLAG_OVERLAPPED); 1295 1296 if (socket == INVALID_SOCKET) { 1297 return WSAGetLastError(); 1298 } 1299 1300 err = uv__tcp_set_socket( 1301 tcp->loop, tcp, socket, xfer_info->socket_info.iAddressFamily, 1); 1302 if (err) { 1303 closesocket(socket); 1304 return err; 1305 } 1306 1307 tcp->delayed_error = xfer_info->delayed_error; 1308 tcp->flags |= UV_HANDLE_BOUND | UV_HANDLE_SHARED_TCP_SOCKET; 1309 1310 if (xfer_type == UV__IPC_SOCKET_XFER_TCP_CONNECTION) { 1311 uv__connection_init((uv_stream_t*)tcp); 1312 tcp->flags |= UV_HANDLE_READABLE | UV_HANDLE_WRITABLE; 1313 } 1314 1315 return 0; 1316 } 1317 1318 1319 int uv_tcp_nodelay(uv_tcp_t* handle, int enable) { 1320 int err; 1321 1322 if (handle->socket != INVALID_SOCKET) { 1323 err = uv__tcp_nodelay(handle, handle->socket, enable); 1324 if (err) 1325 return uv_translate_sys_error(err); 1326 } 1327 1328 if (enable) { 1329 handle->flags |= UV_HANDLE_TCP_NODELAY; 1330 } else { 1331 handle->flags &= ~UV_HANDLE_TCP_NODELAY; 1332 } 1333 1334 return 0; 1335 } 1336 1337 1338 int uv_tcp_keepalive(uv_tcp_t* handle, int enable, unsigned int delay) { 1339 int err; 1340 1341 if (handle->socket != INVALID_SOCKET) { 1342 err = uv__tcp_keepalive(handle, handle->socket, enable, delay); 1343 if (err) 1344 return uv_translate_sys_error(err); 1345 } 1346 1347 if (enable) { 1348 handle->flags |= UV_HANDLE_TCP_KEEPALIVE; 1349 } else { 1350 handle->flags &= ~UV_HANDLE_TCP_KEEPALIVE; 1351 } 1352 1353 /* TODO: Store delay if handle->socket isn't created yet. */ 1354 1355 return 0; 1356 } 1357 1358 1359 int uv_tcp_simultaneous_accepts(uv_tcp_t* handle, int enable) { 1360 if (handle->flags & UV_HANDLE_CONNECTION) { 1361 return UV_EINVAL; 1362 } 1363 1364 /* Check if we're already in the desired mode. */ 1365 if ((enable && !(handle->flags & UV_HANDLE_TCP_SINGLE_ACCEPT)) || 1366 (!enable && handle->flags & UV_HANDLE_TCP_SINGLE_ACCEPT)) { 1367 return 0; 1368 } 1369 1370 /* Don't allow switching from single pending accept to many. */ 1371 if (enable) { 1372 return UV_ENOTSUP; 1373 } 1374 1375 /* Check if we're in a middle of changing the number of pending accepts. */ 1376 if (handle->flags & UV_HANDLE_TCP_ACCEPT_STATE_CHANGING) { 1377 return 0; 1378 } 1379 1380 handle->flags |= UV_HANDLE_TCP_SINGLE_ACCEPT; 1381 1382 /* Flip the changing flag if we have already queued multiple accepts. */ 1383 if (handle->flags & UV_HANDLE_LISTENING) { 1384 handle->flags |= UV_HANDLE_TCP_ACCEPT_STATE_CHANGING; 1385 } 1386 1387 return 0; 1388 } 1389 1390 1391 static void uv__tcp_try_cancel_reqs(uv_tcp_t* tcp) { 1392 SOCKET socket; 1393 int non_ifs_lsp; 1394 int reading; 1395 int writing; 1396 1397 socket = tcp->socket; 1398 reading = tcp->flags & UV_HANDLE_READ_PENDING; 1399 writing = tcp->stream.conn.write_reqs_pending > 0; 1400 if (!reading && !writing) 1401 return; 1402 1403 /* TODO: in libuv v2, keep explicit track of write_reqs, so we can cancel 1404 * them each explicitly with CancelIoEx (like unix). */ 1405 if (reading) 1406 CancelIoEx((HANDLE) socket, &tcp->read_req.u.io.overlapped); 1407 if (writing) 1408 CancelIo((HANDLE) socket); 1409 1410 /* Check if we have any non-IFS LSPs stacked on top of TCP */ 1411 non_ifs_lsp = (tcp->flags & UV_HANDLE_IPV6) ? uv_tcp_non_ifs_lsp_ipv6 : 1412 uv_tcp_non_ifs_lsp_ipv4; 1413 1414 /* If there are non-ifs LSPs then try to obtain a base handle for the socket. 1415 */ 1416 if (non_ifs_lsp) { 1417 DWORD bytes; 1418 if (WSAIoctl(socket, 1419 SIO_BASE_HANDLE, 1420 NULL, 1421 0, 1422 &socket, 1423 sizeof socket, 1424 &bytes, 1425 NULL, 1426 NULL) != 0) { 1427 /* Failed. We can't do CancelIo. */ 1428 return; 1429 } 1430 } 1431 1432 assert(socket != 0 && socket != INVALID_SOCKET); 1433 1434 if (socket != tcp->socket) { 1435 if (reading) 1436 CancelIoEx((HANDLE) socket, &tcp->read_req.u.io.overlapped); 1437 if (writing) 1438 CancelIo((HANDLE) socket); 1439 } 1440 } 1441 1442 1443 void uv__tcp_close(uv_loop_t* loop, uv_tcp_t* tcp) { 1444 if (tcp->flags & UV_HANDLE_CONNECTION) { 1445 if (tcp->flags & UV_HANDLE_READING) { 1446 uv_read_stop((uv_stream_t*) tcp); 1447 } 1448 uv__tcp_try_cancel_reqs(tcp); 1449 } else { 1450 if (tcp->tcp.serv.accept_reqs != NULL) { 1451 /* First close the incoming sockets to cancel the accept operations before 1452 * we free their resources. */ 1453 unsigned int i; 1454 for (i = 0; i < uv_simultaneous_server_accepts; i++) { 1455 uv_tcp_accept_t* req = &tcp->tcp.serv.accept_reqs[i]; 1456 if (req->accept_socket != INVALID_SOCKET) { 1457 closesocket(req->accept_socket); 1458 req->accept_socket = INVALID_SOCKET; 1459 } 1460 } 1461 } 1462 assert(!(tcp->flags & UV_HANDLE_READING)); 1463 } 1464 1465 if (tcp->flags & UV_HANDLE_LISTENING) { 1466 tcp->flags &= ~UV_HANDLE_LISTENING; 1467 DECREASE_ACTIVE_COUNT(loop, tcp); 1468 } 1469 1470 tcp->flags &= ~(UV_HANDLE_READABLE | UV_HANDLE_WRITABLE); 1471 uv__handle_closing(tcp); 1472 1473 /* If any overlapped req failed to cancel, calling `closesocket` now would 1474 * cause Win32 to send an RST packet. Try to avoid that for writes, if 1475 * possibly applicable, by waiting to process the completion notifications 1476 * first (which typically should be cancellations). There's not much we can 1477 * do about canceled reads, which also will generate an RST packet. */ 1478 if (!(tcp->flags & UV_HANDLE_CONNECTION) || 1479 tcp->stream.conn.write_reqs_pending == 0) { 1480 closesocket(tcp->socket); 1481 tcp->socket = INVALID_SOCKET; 1482 } 1483 1484 if (tcp->reqs_pending == 0) 1485 uv__want_endgame(loop, (uv_handle_t*) tcp); 1486 } 1487 1488 1489 int uv_tcp_open(uv_tcp_t* handle, uv_os_sock_t sock) { 1490 WSAPROTOCOL_INFOW protocol_info; 1491 int opt_len; 1492 int err; 1493 struct sockaddr_storage saddr; 1494 int saddr_len; 1495 1496 /* Detect the address family of the socket. */ 1497 opt_len = (int) sizeof protocol_info; 1498 if (getsockopt(sock, 1499 SOL_SOCKET, 1500 SO_PROTOCOL_INFOW, 1501 (char*) &protocol_info, 1502 &opt_len) == SOCKET_ERROR) { 1503 return uv_translate_sys_error(GetLastError()); 1504 } 1505 1506 err = uv__tcp_set_socket(handle->loop, 1507 handle, 1508 sock, 1509 protocol_info.iAddressFamily, 1510 1); 1511 if (err) { 1512 return uv_translate_sys_error(err); 1513 } 1514 1515 /* Support already active socket. */ 1516 saddr_len = sizeof(saddr); 1517 if (!uv_tcp_getsockname(handle, (struct sockaddr*) &saddr, &saddr_len)) { 1518 /* Socket is already bound. */ 1519 handle->flags |= UV_HANDLE_BOUND; 1520 saddr_len = sizeof(saddr); 1521 if (!uv_tcp_getpeername(handle, (struct sockaddr*) &saddr, &saddr_len)) { 1522 /* Socket is already connected. */ 1523 uv__connection_init((uv_stream_t*) handle); 1524 handle->flags |= UV_HANDLE_READABLE | UV_HANDLE_WRITABLE; 1525 } 1526 } 1527 1528 return 0; 1529 } 1530 1531 1532 /* This function is an egress point, i.e. it returns libuv errors rather than 1533 * system errors. 1534 */ 1535 int uv__tcp_bind(uv_tcp_t* handle, 1536 const struct sockaddr* addr, 1537 unsigned int addrlen, 1538 unsigned int flags) { 1539 int err; 1540 1541 err = uv__tcp_try_bind(handle, addr, addrlen, flags); 1542 if (err) 1543 return uv_translate_sys_error(err); 1544 1545 return 0; 1546 } 1547 1548 1549 /* This function is an egress point, i.e. it returns libuv errors rather than 1550 * system errors. 1551 */ 1552 int uv__tcp_connect(uv_connect_t* req, 1553 uv_tcp_t* handle, 1554 const struct sockaddr* addr, 1555 unsigned int addrlen, 1556 uv_connect_cb cb) { 1557 int err; 1558 1559 err = uv__tcp_try_connect(req, handle, addr, addrlen, cb); 1560 if (err) 1561 return uv_translate_sys_error(err); 1562 1563 return 0; 1564 } 1565 1566 1567 int uv_socketpair(int type, int protocol, uv_os_sock_t fds[2], int flags0, int flags1) { 1568 SOCKET server = INVALID_SOCKET; 1569 SOCKET client0 = INVALID_SOCKET; 1570 SOCKET client1 = INVALID_SOCKET; 1571 SOCKADDR_IN name; 1572 LPFN_ACCEPTEX func_acceptex; 1573 WSAOVERLAPPED overlap; 1574 char accept_buffer[sizeof(struct sockaddr_storage) * 2 + 32]; 1575 int namelen; 1576 int err; 1577 DWORD bytes; 1578 DWORD flags; 1579 DWORD client0_flags = WSA_FLAG_NO_HANDLE_INHERIT; 1580 DWORD client1_flags = WSA_FLAG_NO_HANDLE_INHERIT; 1581 1582 if (flags0 & UV_NONBLOCK_PIPE) 1583 client0_flags |= WSA_FLAG_OVERLAPPED; 1584 if (flags1 & UV_NONBLOCK_PIPE) 1585 client1_flags |= WSA_FLAG_OVERLAPPED; 1586 1587 server = WSASocketW(AF_INET, type, protocol, NULL, 0, 1588 WSA_FLAG_OVERLAPPED | WSA_FLAG_NO_HANDLE_INHERIT); 1589 if (server == INVALID_SOCKET) 1590 goto wsaerror; 1591 if (!SetHandleInformation((HANDLE) server, HANDLE_FLAG_INHERIT, 0)) 1592 goto error; 1593 name.sin_family = AF_INET; 1594 name.sin_addr.s_addr = htonl(INADDR_LOOPBACK); 1595 name.sin_port = 0; 1596 if (bind(server, (SOCKADDR*) &name, sizeof(name)) != 0) 1597 goto wsaerror; 1598 if (listen(server, 1) != 0) 1599 goto wsaerror; 1600 namelen = sizeof(name); 1601 if (getsockname(server, (SOCKADDR*) &name, &namelen) != 0) 1602 goto wsaerror; 1603 client0 = WSASocketW(AF_INET, type, protocol, NULL, 0, client0_flags); 1604 if (client0 == INVALID_SOCKET) 1605 goto wsaerror; 1606 if (!SetHandleInformation((HANDLE) client0, HANDLE_FLAG_INHERIT, 0)) 1607 goto error; 1608 if (connect(client0, (SOCKADDR*) &name, sizeof(name)) != 0) 1609 goto wsaerror; 1610 client1 = WSASocketW(AF_INET, type, protocol, NULL, 0, client1_flags); 1611 if (client1 == INVALID_SOCKET) 1612 goto wsaerror; 1613 if (!SetHandleInformation((HANDLE) client1, HANDLE_FLAG_INHERIT, 0)) 1614 goto error; 1615 if (!uv__get_acceptex_function(server, &func_acceptex)) { 1616 err = WSAEAFNOSUPPORT; 1617 goto cleanup; 1618 } 1619 memset(&overlap, 0, sizeof(overlap)); 1620 if (!func_acceptex(server, 1621 client1, 1622 accept_buffer, 1623 0, 1624 sizeof(struct sockaddr_storage), 1625 sizeof(struct sockaddr_storage), 1626 &bytes, 1627 &overlap)) { 1628 err = WSAGetLastError(); 1629 if (err == ERROR_IO_PENDING) { 1630 /* Result should complete immediately, since we already called connect, 1631 * but empirically, we sometimes have to poll the kernel a couple times 1632 * until it notices that. */ 1633 while (!WSAGetOverlappedResult(client1, &overlap, &bytes, FALSE, &flags)) { 1634 err = WSAGetLastError(); 1635 if (err != WSA_IO_INCOMPLETE) 1636 goto cleanup; 1637 SwitchToThread(); 1638 } 1639 } 1640 else { 1641 goto cleanup; 1642 } 1643 } 1644 if (setsockopt(client1, SOL_SOCKET, SO_UPDATE_ACCEPT_CONTEXT, 1645 (char*) &server, sizeof(server)) != 0) { 1646 goto wsaerror; 1647 } 1648 1649 closesocket(server); 1650 1651 fds[0] = client0; 1652 fds[1] = client1; 1653 1654 return 0; 1655 1656 wsaerror: 1657 err = WSAGetLastError(); 1658 goto cleanup; 1659 1660 error: 1661 err = GetLastError(); 1662 goto cleanup; 1663 1664 cleanup: 1665 if (server != INVALID_SOCKET) 1666 closesocket(server); 1667 if (client0 != INVALID_SOCKET) 1668 closesocket(client0); 1669 if (client1 != INVALID_SOCKET) 1670 closesocket(client1); 1671 1672 assert(err); 1673 return uv_translate_sys_error(err); 1674 } 1675