X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/bfa7bf7d6b75e4fa31db205cf0b339c28ea6d090..154fd1e4735bde68600b1901ddb3668d67216de0:/src/common/socket.cpp diff --git a/src/common/socket.cpp b/src/common/socket.cpp index 5e8f4ff8de..8edfe18588 100644 --- a/src/common/socket.cpp +++ b/src/common/socket.cpp @@ -122,12 +122,26 @@ bool wxSocketBase::Initialize() { if ( !m_countInit++ ) { + /* + Details: Initialize() creates a hidden window as a sink for socket + events, such as 'read completed'. wxMSW has only one message loop + for the main thread. If Initialize is called in a secondary thread, + the socket window will be created for the secondary thread, but + since there is no message loop on this thread, it will never + receive events and all socket operations will time out. + BTW, the main thread must not be stopped using sleep or block + on a semaphore (a bad idea in any case) or socket operations + will time out. + */ + wxASSERT_MSG( wxThread::IsMain(), + wxT("Call wxSocketBase::Initialize() from the main thread first!")); + wxAppTraits *traits = wxAppConsole::GetInstance() ? wxAppConsole::GetInstance()->GetTraits() : NULL; - GSocketGUIFunctionsTable *functions = + GSocketGUIFunctionsTable *functions = traits ? traits->GetSocketGUIFunctionsTable() : NULL; GSocket_SetGUIFunctions(functions); - + if ( !GSocket_Init() ) { m_countInit--; @@ -680,7 +694,7 @@ bool wxSocketBase::_Wait(long seconds, #if !defined(wxUSE_GUI) || !wxUSE_GUI GSocket_SetTimeout(m_socket, timeout); -#endif +#endif // Wait in an active polling loop. // @@ -840,7 +854,7 @@ void wxSocketBase::RestoreState() m_notify = state->m_notify; m_eventmask = state->m_eventmask; m_clientData = state->m_clientData; - + m_states.Erase(node); delete state; } @@ -1054,6 +1068,11 @@ wxSocketServer::wxSocketServer(wxSockAddress& addr_man, // Setup the socket as server GSocket_SetLocal(m_socket, addr_man.GetAddress()); + + if (GetFlags() & wxSOCKET_REUSEADDR) { + GSocket_SetReusable(m_socket); + } + if (GSocket_SetServer(m_socket) != GSOCK_NOERROR) { GSocket_destroy(m_socket); @@ -1129,7 +1148,7 @@ bool wxSocketServer::WaitForAccept(long seconds, long milliseconds) bool wxSocketBase::GetOption(int level, int optname, void *optval, int *optlen) { - if (GSocket_GetSockOpt(m_socket, level, optname, optval, optlen) + if (GSocket_GetSockOpt(m_socket, level, optname, optval, optlen) != GSOCK_NOERROR) { return FALSE; @@ -1137,10 +1156,10 @@ bool wxSocketBase::GetOption(int level, int optname, void *optval, int *optlen) return TRUE; } -bool wxSocketBase::SetOption(int level, int optname, const void *optval, +bool wxSocketBase::SetOption(int level, int optname, const void *optval, int optlen) { - if (GSocket_SetSockOpt(m_socket, level, optname, optval, optlen) + if (GSocket_SetSockOpt(m_socket, level, optname, optval, optlen) != GSOCK_NOERROR) { return FALSE; @@ -1248,7 +1267,6 @@ wxDatagramSocket::wxDatagramSocket( wxSockAddress& addr, return; } // Setup the socket as non connection oriented - GSocket_Unstreamed(m_socket); GSocket_SetLocal(m_socket, addr.GetAddress()); if( GSocket_SetNonOriented(m_socket) != GSOCK_NOERROR ) {