23 #ifdef GRPC_WINSOCK_SOCKET
46 #if defined(__MSYS__) && defined(GPR_ARCH_64)
49 #define GRPC_FIONBIO _IOW('f', 126, uint32_t)
51 #define GRPC_FIONBIO FIONBIO
60 status = WSAIoctl(sock, GRPC_FIONBIO, ¶m,
sizeof(param), NULL, 0, &
ret,
69 unsigned long param = 0;
80 status = ::setsockopt(sock, IPPROTO_TCP, TCP_NODELAY,
81 reinterpret_cast<char*
>(¶m),
sizeof(param));
82 if (
status == SOCKET_ERROR) {
83 status = WSAGetLastError();
91 err = grpc_tcp_set_non_block(sock);
93 err = set_dualstack(sock);
95 err = enable_socket_low_latency(sock);
100 typedef struct grpc_tcp {
130 static void tcp_free(grpc_tcp*
tcp) {
131 grpc_winsocket_destroy(
tcp->socket);
139 #define TCP_UNREF(tcp, reason) tcp_unref((tcp), (reason), __FILE__, __LINE__)
140 #define TCP_REF(tcp, reason) tcp_ref((tcp), (reason), __FILE__, __LINE__)
141 static void tcp_unref(grpc_tcp*
tcp,
const char* reason,
const char*
file,
146 "TCP unref %p : %s %" PRIdPTR
" -> %" PRIdPTR,
tcp, reason, val,
154 static void tcp_ref(grpc_tcp*
tcp,
const char* reason,
const char*
file,
159 "TCP ref %p : %s %" PRIdPTR
" -> %" PRIdPTR,
tcp, reason, val,
165 #define TCP_UNREF(tcp, reason) tcp_unref((tcp))
166 #define TCP_REF(tcp, reason) tcp_ref((tcp))
167 static void tcp_unref(grpc_tcp*
tcp) {
173 static void tcp_ref(grpc_tcp*
tcp) {
gpr_ref(&
tcp->refcount); }
178 grpc_tcp*
tcp = (grpc_tcp*)tcpp;
181 grpc_winsocket_callback_info* info = &
socket->read_info;
190 if (info->wsa_error != 0 && !
tcp->shutting_down) {
196 if (info->bytes_transferred != 0 && !
tcp->shutting_down) {
197 GPR_ASSERT((
size_t)info->bytes_transferred <=
tcp->read_slices->length);
198 if (
static_cast<size_t>(info->bytes_transferred) !=
199 tcp->read_slices->length) {
202 tcp->read_slices->length -
203 static_cast<size_t>(info->bytes_transferred),
204 &
tcp->last_read_buffer);
206 GPR_ASSERT((
size_t)info->bytes_transferred ==
tcp->read_slices->length);
210 for (
i = 0;
i <
tcp->read_slices->count;
i++) {
214 tcp->peer_string.c_str(), dump);
226 "TCP stream shutting down", &
tcp->shutdown_error, 1)
234 TCP_UNREF(
tcp,
"read");
238 #define DEFAULT_TARGET_READ_SIZE 8192
239 #define MAX_WSABUF_COUNT 16
242 grpc_tcp*
tcp = (grpc_tcp*)ep;
244 grpc_winsocket_callback_info* info = &
handle->read_info;
248 WSABUF buffers[MAX_WSABUF_COUNT];
255 if (
tcp->shutting_down) {
260 "TCP socket is shutting down", &
tcp->shutdown_error, 1),
266 tcp->read_slices = read_slices;
270 if (
tcp->read_slices->length < DEFAULT_TARGET_READ_SIZE / 2 &&
271 tcp->read_slices->count < MAX_WSABUF_COUNT) {
278 for (
i = 0;
i <
tcp->read_slices->count;
i++) {
280 tcp->read_slices->slices[
i]);
284 TCP_REF(
tcp,
"read");
287 status = WSARecv(
tcp->socket->socket, buffers, (DWORD)
tcp->read_slices->count,
289 info->wsa_error =
status == 0 ? 0 : WSAGetLastError();
292 if (info->wsa_error != WSAEWOULDBLOCK) {
299 memset(&
tcp->socket->read_info.overlapped, 0,
sizeof(OVERLAPPED));
300 status = WSARecv(
tcp->socket->socket, buffers, (DWORD)
tcp->read_slices->count,
304 int wsa_error = WSAGetLastError();
305 if (wsa_error != WSA_IO_PENDING) {
306 info->wsa_error = wsa_error;
313 grpc_socket_notify_on_read(
tcp->socket, &
tcp->on_read);
318 grpc_tcp*
tcp = (grpc_tcp*)tcpp;
320 grpc_winsocket_callback_info* info = &
handle->write_info;
331 tcp->write_cb = NULL;
335 if (info->wsa_error != 0) {
338 GPR_ASSERT(info->bytes_transferred ==
tcp->write_slices->length);
342 TCP_UNREF(
tcp,
"write");
349 grpc_tcp*
tcp = (grpc_tcp*)ep;
351 grpc_winsocket_callback_info* info = &
socket->write_info;
355 WSABUF local_buffers[MAX_WSABUF_COUNT];
356 WSABUF* allocated = NULL;
357 WSABUF* buffers = local_buffers;
371 if (
tcp->shutting_down) {
376 "TCP socket is shutting down", &
tcp->shutdown_error, 1),
385 buffers = (WSABUF*)
gpr_malloc(
sizeof(WSABUF) *
tcp->write_slices->count);
389 for (
i = 0;
i <
tcp->write_slices->count;
i++) {
392 buffers[
i].len = (ULONG)
len;
397 status = WSASend(
socket->socket, buffers, (DWORD)
tcp->write_slices->count,
399 info->wsa_error =
status == 0 ? 0 : WSAGetLastError();
404 if (info->wsa_error != WSAEWOULDBLOCK) {
413 TCP_REF(
tcp,
"write");
417 memset(&
socket->write_info.overlapped, 0,
sizeof(OVERLAPPED));
418 status = WSASend(
socket->socket, buffers, (DWORD)
tcp->write_slices->count,
423 int wsa_error = WSAGetLastError();
424 if (wsa_error != WSA_IO_PENDING) {
425 TCP_UNREF(
tcp,
"write");
434 grpc_socket_notify_on_write(
socket, &
tcp->on_write);
441 grpc_iocp_add_socket(
tcp->socket);
448 grpc_iocp_add_socket(
tcp->socket);
461 grpc_tcp*
tcp = (grpc_tcp*)ep;
465 if (!
tcp->shutting_down) {
466 tcp->shutting_down = 1;
467 tcp->shutdown_error = why;
471 grpc_winsocket_shutdown(
tcp->socket);
476 grpc_tcp*
tcp = (grpc_tcp*)ep;
478 TCP_UNREF(
tcp,
"destroy");
482 grpc_tcp*
tcp = (grpc_tcp*)ep;
483 return tcp->peer_string;
487 grpc_tcp*
tcp = (grpc_tcp*)ep;
488 return tcp->local_address;
493 static bool win_can_track_err(
grpc_endpoint* ep) {
return false; }
498 win_add_to_pollset_set,
499 win_delete_from_pollset_set,
503 win_get_local_address,
512 grpc_tcp*
tcp =
new grpc_tcp{};
520 resolved_local_addr.
len =
sizeof(resolved_local_addr.
addr);
522 if (getsockname(
tcp->socket->socket,
523 reinterpret_cast<sockaddr*
>(resolved_local_addr.
addr),
524 &resolved_local_addr.
len) < 0 ||
526 tcp->local_address =
"";