]> git.saurik.com Git - wxWidgets.git/commitdiff
fix handling of wxSOCKET_REUSEADDR in wxDatagramSocket (patch 1667145)
authorVadim Zeitlin <vadim@wxwidgets.org>
Wed, 7 Mar 2007 23:18:40 +0000 (23:18 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Wed, 7 Mar 2007 23:18:40 +0000 (23:18 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@44661 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

docs/changes.txt
src/common/socket.cpp
src/msw/gsocket.cpp

index 1f756b419d05d86ecacbf1fcc3f6e2b52d2cc788..2ba3c52ce5d9c42def493f73a8397064af21758c 100644 (file)
@@ -64,6 +64,7 @@ All:
 - Added wxSearchCtrl::[Get|Set]DescriptiveText.
 - Fixed detection of number of processors under Linux 2.6
 - Fixed Base64 computation in wxHTTP (p_michalczyk)
+- Fix handling of wxSOCKET_REUSEADDR in wxDatagramSocket (troelsk)
 
 wxMSW
 
index 28a929198ce9ed97b8680ef100b52a537d5df2d8..e36bfe9768f3ec07e2fbd04b125eb6afff30cf62 100644 (file)
@@ -1344,14 +1344,18 @@ wxDatagramSocket::wxDatagramSocket( const wxSockAddress& addr,
     // Create the socket
     m_socket = GSocket_new();
 
-    if(!m_socket)
+    if (!m_socket)
     {
         wxFAIL_MSG( _T("datagram socket not new'd") );
         return;
     }
     // Setup the socket as non connection oriented
     m_socket->SetLocal(addr.GetAddress());
-    if( m_socket->SetNonOriented() != GSOCK_NOERROR )
+    if (flags & wxSOCKET_REUSEADDR)
+    {
+        m_socket->SetReusable();
+    }
+    if ( m_socket->SetNonOriented() != GSOCK_NOERROR )
     {
         delete m_socket;
         m_socket = NULL;
index 924668cd1f9d43ad3d01f8b4312382cf3b81689b..c107146e2c615ede248523219ddb330278552e40 100644 (file)
@@ -399,8 +399,9 @@ GSocketError GSocket::SetServer()
   /* allow a socket to re-bind if the socket is in the TIME_WAIT
      state after being previously closed.
    */
-  if (m_reusable) {
-    setsockopt(m_fd, SOL_SOCKET, SO_REUSEADDR, (const char*)&arg, sizeof(u_long));
+  if (m_reusable)
+  {
+    setsockopt(m_fd, SOL_SOCKET, SO_REUSEADDR, (const char*)&arg, sizeof(arg));
   }
 
   /* Bind to the local address,
@@ -596,7 +597,7 @@ GSocketError GSocket::Connect(GSocketStream stream)
   // If the reuse flag is set, use the applicable socket reuse flag
   if (m_reusable)
   {
-     setsockopt(m_fd, SOL_SOCKET, SO_REUSEADDR, (const char*)&arg, sizeof(u_long));
+     setsockopt(m_fd, SOL_SOCKET, SO_REUSEADDR, (const char*)&arg, sizeof(arg));
   }
 
   // If a local address has been set, then we need to bind to it before calling connect
@@ -701,6 +702,11 @@ GSocketError GSocket::SetNonOriented()
   ioctlsocket(m_fd, FIONBIO, (u_long FAR *) &arg);
   gs_gui_functions->Enable_Events(this);
 
+  if (m_reusable)
+  {
+    setsockopt(m_fd, SOL_SOCKET, SO_REUSEADDR, (const char*)&arg, sizeof(arg));
+  }
+
   /* Bind to the local address,
    * and retrieve the actual address bound.
    */