23 #ifdef GRPC_WINSOCK_SOCKET
30 #include "absl/strings/str_format.h"
43 static DWORD s_wsa_socket_flags;
45 grpc_winsocket* grpc_winsocket_create(SOCKET
socket,
const char*
name) {
46 grpc_winsocket*
r = (grpc_winsocket*)
gpr_malloc(
sizeof(grpc_winsocket));
47 memset(
r, 0,
sizeof(grpc_winsocket));
52 grpc_iocp_add_socket(
r);
56 SOCKET grpc_winsocket_wrapped_socket(grpc_winsocket*
socket) {
64 void grpc_winsocket_shutdown(grpc_winsocket* winsocket) {
70 DWORD ioctl_num_bytes;
73 if (winsocket->shutdown_called) {
77 winsocket->shutdown_called =
true;
80 status = WSAIoctl(winsocket->socket, SIO_GET_EXTENSION_FUNCTION_POINTER,
81 &guid,
sizeof(guid), &DisconnectEx,
sizeof(DisconnectEx),
82 &ioctl_num_bytes, NULL, NULL);
85 DisconnectEx(winsocket->socket, NULL, 0, 0);
95 static void destroy(grpc_winsocket* winsocket) {
101 static bool check_destroyable(grpc_winsocket* winsocket) {
102 return winsocket->destroy_called ==
true &&
103 winsocket->write_info.closure == NULL &&
104 winsocket->read_info.closure == NULL;
107 void grpc_winsocket_destroy(grpc_winsocket* winsocket) {
110 winsocket->destroy_called =
true;
111 bool should_destroy = check_destroyable(winsocket);
113 if (should_destroy)
destroy(winsocket);
121 grpc_winsocket_callback_info* info) {
124 if (info->has_pending_iocp) {
125 info->has_pending_iocp = 0;
133 void grpc_socket_notify_on_write(grpc_winsocket*
socket,
142 void grpc_socket_become_ready(grpc_winsocket*
socket,
143 grpc_winsocket_callback_info* info) {
148 info->closure = NULL;
150 info->has_pending_iocp = 1;
152 bool should_destroy = check_destroyable(
socket);
158 static bool g_ipv6_loopback_available =
false;
160 static void probe_ipv6_once(
void) {
162 g_ipv6_loopback_available = 0;
163 if (s == INVALID_SOCKET) {
164 gpr_log(
GPR_INFO,
"Disabling AF_INET6 sockets because socket() failed.");
166 grpc_sockaddr_in6
addr;
169 addr.sin6_addr.s6_addr[15] = 1;
170 if (bind(s,
reinterpret_cast<grpc_sockaddr*
>(&
addr),
sizeof(
addr)) == 0) {
171 g_ipv6_loopback_available = 1;
174 "Disabling AF_INET6 sockets because ::1 is not available.");
182 return g_ipv6_loopback_available;
185 DWORD grpc_get_default_wsa_socket_flags() {
return s_wsa_socket_flags; }
187 void grpc_wsa_socket_flags_init() {
188 s_wsa_socket_flags = WSA_FLAG_OVERLAPPED;
193 SOCKET sock = WSASocket(
AF_INET6, SOCK_STREAM, IPPROTO_TCP, NULL, 0,
194 s_wsa_socket_flags | WSA_FLAG_NO_HANDLE_INHERIT);
195 if (sock != INVALID_SOCKET) {
197 s_wsa_socket_flags |= WSA_FLAG_NO_HANDLE_INHERIT;