]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/gsockmsw.cpp
use int instead of SOCKET to avoid including winsock.h from wx/gsocket.h
[wxWidgets.git] / src / msw / gsockmsw.cpp
index a1ada1918bceac633f96a474fbe5c618d7184244..3ca8b48349e4ae395c8d6f798741eca4b3bbdc03 100644 (file)
@@ -38,6 +38,9 @@
 
 #include "wx/gsocket.h"
 #include "wx/apptrait.h"
+#include "wx/link.h"
+
+wxFORCE_LINK_THIS_MODULE(gsockmsw)
 
 extern "C" WXDLLIMPEXP_BASE HINSTANCE wxGetInstance();
 #define INSTANCE wxGetInstance()
@@ -310,8 +313,21 @@ void GSocketMSWManager::Destroy_Socket(GSocket *socket)
 {
   /* Remove the socket from the list */
   EnterCriticalSection(&critical);
-  if ( socket->IsOk() )
-      socketList[(socket->m_msgnumber - WM_USER)] = NULL;
+
+  const int msgnum = socket->m_msgnumber;
+  if ( msgnum )
+  {
+      // we need to remove any pending messages for this socket to avoid having
+      // them sent to a new socket which could reuse the same message number as
+      // soon as we destroy this one
+      MSG msg;
+      while ( ::PeekMessage(&msg, hWin, msgnum, msgnum, PM_REMOVE) )
+          ;
+
+      socketList[msgnum - WM_USER] = NULL;
+  }
+  //else: the socket has never been created successfully
+
   LeaveCriticalSection(&critical);
 }
 
@@ -351,7 +367,7 @@ LRESULT CALLBACK _GSocket_Internal_WinProc(HWND hWnd,
      * destroyed) and for safety, check that the m_fd field
      * is what we expect it to be.
      */
-    if ((socket != NULL) && (socket->m_fd == wParam))
+    if ((socket != NULL) && ((WPARAM)socket->m_fd == wParam))
     {
       switch WSAGETSELECTEVENT(lParam)
       {
@@ -458,6 +474,6 @@ static struct ManagerSetter
         static GSocketMSWManager s_manager;
         wxAppTraits::SetDefaultSocketManager(&s_manager);
     }
-} gsm_managerSetter;
+} gs_managerSetter;
 
 #endif  // wxUSE_SOCKETS