23 #ifdef GRPC_WINSOCK_SOCKET
30 #include "absl/strings/str_cat.h"
50 #define MIN_SAFE_ACCEPT_QUEUE_SIZE 100
57 uint8_t addresses[(
sizeof(grpc_sockaddr_in6) + 16) * 2];
69 int outstanding_calls;
111 s->on_accept_cb = NULL;
112 s->on_accept_cb_arg = NULL;
115 s->shutdown_starting.head = NULL;
116 s->shutdown_starting.tail = NULL;
132 grpc_winsocket_destroy(sp->socket);
141 if (
s->shutdown_complete != NULL) {
170 if (
s->active_ports == 0) {
171 finish_shutdown_locked(s);
173 for (sp =
s->head; sp; sp = sp->
next) {
174 sp->shutting_down = 1;
175 grpc_winsocket_shutdown(sp->socket);
187 tcp_server_destroy(s);
197 int sockname_temp_len;
199 error = grpc_tcp_prepare_socket(sock);
204 if (bind(sock, (
const grpc_sockaddr*)
addr->addr, (
int)
addr->len) ==
210 if (
listen(sock, SOMAXCONN) == SOCKET_ERROR) {
215 sockname_temp_len =
sizeof(
struct sockaddr_storage);
216 if (getsockname(sock, (grpc_sockaddr*)sockname_temp.
addr,
217 &sockname_temp_len) == SOCKET_ERROR) {
221 sockname_temp.
len = (size_t)sockname_temp_len;
232 "Failed to prepare server socket", &
error, 1),
234 addr_uri.ok() ? *addr_uri : addr_uri.status().ToString()),
242 sp->shutting_down = 0;
245 finish_shutdown_locked(sp->
server);
252 SOCKET sock = INVALID_SOCKET;
254 DWORD addrlen =
sizeof(grpc_sockaddr_in6) + 16;
258 if (
port->shutting_down) {
262 sock = WSASocket(
AF_INET6, SOCK_STREAM, IPPROTO_TCP, NULL, 0,
263 grpc_get_default_wsa_socket_flags());
264 if (sock == INVALID_SOCKET) {
269 error = grpc_tcp_prepare_socket(sock);
273 success =
port->AcceptEx(
port->socket->socket, sock,
port->addresses, 0,
275 &
port->socket->read_info.overlapped);
280 int last_error = WSAGetLastError();
281 if (last_error != ERROR_IO_PENDING) {
289 port->new_socket = sock;
290 grpc_socket_notify_on_read(
port->socket, &
port->on_accept);
291 port->outstanding_calls++;
303 SOCKET sock = sp->new_socket;
304 grpc_winsocket_callback_info* info = &sp->socket->read_info;
307 DWORD transfered_bytes;
314 peer_name.
len =
sizeof(
struct sockaddr_storage);
328 transfered_bytes = 0;
329 wsa_success = WSAGetOverlappedResult(sock, &info->overlapped,
332 if (!sp->shutting_down) {
339 if (!sp->shutting_down) {
340 err = setsockopt(sock, SOL_SOCKET, SO_UPDATE_ACCEPT_CONTEXT,
341 (
char*)&sp->socket->socket,
sizeof(sp->socket->socket));
347 int peer_name_len = (
int)peer_name.
len;
348 err = getpeername(sock, (grpc_sockaddr*)peer_name.
addr, &peer_name_len);
349 peer_name.
len = (size_t)peer_name_len;
354 peer_name_string = addr_uri.value();
357 addr_uri.status().ToString().c_str());
389 if (0 == --sp->outstanding_calls) {
390 decrement_active_ports_and_notify_locked(sp);
403 DWORD ioctl_num_bytes;
410 WSAIoctl(sock, SIO_GET_EXTENSION_FUNCTION_POINTER, &guid,
sizeof(guid),
411 &AcceptEx,
sizeof(AcceptEx), &ioctl_num_bytes, NULL, NULL);
428 GPR_ASSERT(!
s->on_accept_cb &&
"must add ports before starting server");
431 if (
s->head == NULL) {
438 sp->socket = grpc_winsocket_create(sock,
"listener");
439 sp->shutting_down = 0;
440 sp->outstanding_calls = 0;
441 sp->AcceptEx = AcceptEx;
442 sp->new_socket = INVALID_SOCKET;
462 unsigned port_index = 0;
465 if (
s->tail != NULL) {
466 port_index =
s->tail->port_index + 1;
472 for (sp =
s->head; sp; sp = sp->
next) {
473 int sockname_temp_len =
sizeof(
struct sockaddr_storage);
474 if (0 == getsockname(sp->socket->socket,
475 (grpc_sockaddr*)sockname_temp.
addr,
476 &sockname_temp_len)) {
477 sockname_temp.
len = (size_t)sockname_temp_len;
484 addr = allocated_addr;
492 addr = &addr6_v4mapped;
502 sock = WSASocket(
AF_INET6, SOCK_STREAM, IPPROTO_TCP, NULL, 0,
503 grpc_get_default_wsa_socket_flags());
504 if (sock == INVALID_SOCKET) {
509 error = add_socket_to_server(s, sock,
addr, port_index, &sp);
517 "Failed to add port to server", &
error, 1);
529 const std::vector<grpc_pollset*>* ,
531 void* on_accept_cb_arg) {
537 s->on_accept_cb = on_accept_cb;
538 s->on_accept_cb_arg = on_accept_cb_arg;
539 for (sp =
s->head; sp; sp = sp->
next) {
547 unsigned port_index) {
564 tcp_server_create, tcp_server_start,
565 tcp_server_add_port, tcp_server_create_fd_handler,
566 tcp_server_port_fd_count, tcp_server_port_fd,
567 tcp_server_ref, tcp_server_shutdown_starting_add,
568 tcp_server_unref, tcp_server_shutdown_listeners};