소스 검색

Fixing lingering bytes clipping issue on socket shutdown.

For more information, see comments on
https://msdn.microsoft.com/en-us/library/windows/desktop/ms738547(v=vs.85).aspx
Nicolas Noble 10 년 전
부모
커밋
77ccdb99f8
1개의 변경된 파일22개의 추가작업 그리고 0개의 파일을 삭제
  1. 22 0
      src/core/iomgr/socket_windows.c

+ 22 - 0
src/core/iomgr/socket_windows.c

@@ -35,8 +35,12 @@
 
 
 #ifdef GPR_WINSOCK_SOCKET
 #ifdef GPR_WINSOCK_SOCKET
 
 
+#include <winsock2.h>
+#include <mswsock.h>
+
 #include <grpc/support/alloc.h>
 #include <grpc/support/alloc.h>
 #include <grpc/support/log.h>
 #include <grpc/support/log.h>
+#include <grpc/support/log_win32.h>
 #include <grpc/support/string_util.h>
 #include <grpc/support/string_util.h>
 
 
 #include "src/core/iomgr/iocp_windows.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
    various callsites of that function, which happens to be in various
    mutex hold states, and that'd be unsafe to call them directly. */
    mutex hold states, and that'd be unsafe to call them directly. */
 void grpc_winsocket_shutdown(grpc_winsocket *winsocket) {
 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);
   closesocket(winsocket->socket);
 }
 }