|
|
|
@ -35,8 +35,12 @@ |
|
|
|
|
|
|
|
|
|
#ifdef GPR_WINSOCK_SOCKET |
|
|
|
|
|
|
|
|
|
#include <winsock2.h> |
|
|
|
|
#include <mswsock.h> |
|
|
|
|
|
|
|
|
|
#include <grpc/support/alloc.h> |
|
|
|
|
#include <grpc/support/log.h> |
|
|
|
|
#include <grpc/support/log_win32.h> |
|
|
|
|
#include <grpc/support/string_util.h> |
|
|
|
|
|
|
|
|
|
#include "src/core/iomgr/iocp_windows.h" |
|
|
|
@ -63,6 +67,24 @@ grpc_winsocket *grpc_winsocket_create(SOCKET socket, const char *name) { |
|
|
|
|
various callsites of that function, which happens to be in various |
|
|
|
|
mutex hold states, and that'd be unsafe to call them directly. */ |
|
|
|
|
void grpc_winsocket_shutdown(grpc_winsocket *winsocket) { |
|
|
|
|
/* Grab the function pointer for DisconnectEx for that specific socket.
|
|
|
|
|
It may change depending on the interface. */ |
|
|
|
|
int status; |
|
|
|
|
GUID guid = WSAID_DISCONNECTEX; |
|
|
|
|
LPFN_DISCONNECTEX DisconnectEx; |
|
|
|
|
DWORD ioctl_num_bytes; |
|
|
|
|
|
|
|
|
|
status = WSAIoctl(winsocket->socket, SIO_GET_EXTENSION_FUNCTION_POINTER, |
|
|
|
|
&guid, sizeof(guid), &DisconnectEx, sizeof(DisconnectEx), |
|
|
|
|
&ioctl_num_bytes, NULL, NULL); |
|
|
|
|
|
|
|
|
|
if (status == 0) { |
|
|
|
|
DisconnectEx(winsocket->socket, NULL, 0, 0); |
|
|
|
|
} else { |
|
|
|
|
char *utf8_message = gpr_format_message(WSAGetLastError()); |
|
|
|
|
gpr_log(GPR_ERROR, "Unable to retrieve DisconnectEx pointer : %s", utf8_message); |
|
|
|
|
gpr_free(utf8_message); |
|
|
|
|
} |
|
|
|
|
closesocket(winsocket->socket); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|