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
This commit is contained in:
Vadim Zeitlin
2007-03-07 23:18:40 +00:00
parent 886f61cacb
commit 28bf2f3c66
3 changed files with 16 additions and 5 deletions

View 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

View 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;

View 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.
*/