25 #ifdef GRPC_WINSOCK_SOCKET
43 struct async_connect {
56 static void async_connect_unlock_and_cleanup(async_connect* ac,
58 int done = (--ac->refs == 0);
69 async_connect* ac = (async_connect*)acp;
71 grpc_winsocket*
socket = ac->socket;
74 grpc_winsocket_shutdown(
socket);
76 async_connect_unlock_and_cleanup(ac,
socket);
80 async_connect* ac = (async_connect*)acp;
88 grpc_winsocket*
socket = ac->socket;
98 DWORD transfered_bytes = 0;
101 WSAGetOverlappedResult(
socket->socket, &
socket->write_info.overlapped,
116 async_connect_unlock_and_cleanup(ac,
socket);
129 SOCKET sock = INVALID_SOCKET;
134 grpc_winsocket*
socket = NULL;
137 DWORD ioctl_num_bytes;
138 grpc_winsocket_callback_info* info;
140 async_connect* ac = NULL;
144 if (!addr_uri.
ok()) {
153 addr = &addr6_v4mapped;
156 sock = WSASocket(
AF_INET6, SOCK_STREAM, IPPROTO_TCP, NULL, 0,
157 grpc_get_default_wsa_socket_flags());
158 if (sock == INVALID_SOCKET) {
163 error = grpc_tcp_prepare_socket(sock);
171 WSAIoctl(sock, SIO_GET_EXTENSION_FUNCTION_POINTER, &guid,
sizeof(guid),
172 &ConnectEx,
sizeof(ConnectEx), &ioctl_num_bytes, NULL, NULL);
176 "WSAIoctl(SIO_GET_EXTENSION_FUNCTION_POINTER)");
183 bind(sock, (grpc_sockaddr*)&local_address.
addr, (
int)local_address.
len);
189 socket = grpc_winsocket_create(sock,
"client");
190 info = &
socket->write_info;
191 success = ConnectEx(sock, (grpc_sockaddr*)&
addr->addr, (
int)
addr->len, NULL,
192 0, NULL, &info->overlapped);
197 int last_error = WSAGetLastError();
198 if (last_error != ERROR_IO_PENDING) {
204 ac =
new async_connect();
205 ac->on_done = on_done;
209 ac->addr_name = addr_uri.
value();
210 ac->endpoint = endpoint;
217 grpc_socket_notify_on_write(
socket, &ac->on_connect);
230 grpc_winsocket_destroy(
socket);
231 }
else if (sock != INVALID_SOCKET) {
238 static bool tcp_cancel_connect(
int64_t ) {
return false; }