From 28bf2f3c66b38f65ab98881610b90639f8ef18cc Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Wed, 7 Mar 2007 23:18:40 +0000 Subject: [PATCH] fix handling of wxSOCKET_REUSEADDR in wxDatagramSocket (patch 1667145) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@44661 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- docs/changes.txt | 1 + src/common/socket.cpp | 8 ++++++-- src/msw/gsocket.cpp | 12 +++++++++--- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/docs/changes.txt b/docs/changes.txt index 1f756b419d..2ba3c52ce5 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -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 diff --git a/src/common/socket.cpp b/src/common/socket.cpp index 28a929198c..e36bfe9768 100644 --- a/src/common/socket.cpp +++ b/src/common/socket.cpp @@ -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; diff --git a/src/msw/gsocket.cpp b/src/msw/gsocket.cpp index 924668cd1f..c107146e2c 100644 --- a/src/msw/gsocket.cpp +++ b/src/msw/gsocket.cpp @@ -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. */ -- 2.47.2