X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a645ea885dc5952fe073cba7d2377ca22c3efca0..f9cff6e17341ea95da89eaa27f78b32f11291e12:/src/common/socket.cpp diff --git a/src/common/socket.cpp b/src/common/socket.cpp index 3c4f417e75..032b8f094e 100644 --- a/src/common/socket.cpp +++ b/src/common/socket.cpp @@ -213,7 +213,11 @@ public: { m_socket->m_reading = false; - m_socket->m_impl->ReenableEvents(wxSOCKET_INPUT_FLAG); + // connection could have been lost while reading, in this case calling + // ReenableEvents() would assert and is not necessary anyhow + wxSocketImpl * const impl = m_socket->m_impl; + if ( impl && impl->m_fd != INVALID_SOCKET ) + impl->ReenableEvents(wxSOCKET_INPUT_FLAG); } private: @@ -231,13 +235,15 @@ public: wxASSERT_MSG( !m_socket->m_writing, "write reentrancy?" ); m_socket->m_writing = true; - - m_socket->m_impl->ReenableEvents(wxSOCKET_OUTPUT_FLAG); } ~wxSocketWriteGuard() { m_socket->m_writing = false; + + wxSocketImpl * const impl = m_socket->m_impl; + if ( impl && impl->m_fd != INVALID_SOCKET ) + impl->ReenableEvents(wxSOCKET_OUTPUT_FLAG); } private: @@ -364,6 +370,14 @@ void wxSocketImpl::PostCreation() wxSocketError wxSocketImpl::UpdateLocalAddress() { + if ( !m_local.IsOk() ) + { + // ensure that we have a valid object using the correct family: correct + // being the same one as our peer uses as we have no other way to + // determine it + m_local.Create(m_peer.GetFamily()); + } + WX_SOCKLEN_T lenAddr = m_local.GetLen(); if ( getsockname(m_fd, m_local.GetWritableAddr(), &lenAddr) != 0 ) { @@ -942,7 +956,9 @@ wxUint32 wxSocketBase::DoRead(void* buffer_, wxUint32 nbytes) // events and, even more importantly, we must do this under Windows // where we're not going to get notifications about socket being ready // for reading before we read all the existing data from it - const int ret = m_connected ? m_impl->Read(buffer, nbytes) : 0; + const int ret = !m_impl->m_stream || m_connected + ? m_impl->Read(buffer, nbytes) + : 0; if ( ret == -1 ) { if ( m_impl->GetLastError() == wxSOCKET_WOULDBLOCK ) @@ -1107,7 +1123,7 @@ wxUint32 wxSocketBase::DoWrite(const void *buffer_, wxUint32 nbytes) wxUint32 total = 0; while ( nbytes ) { - if ( !m_connected ) + if ( m_impl->m_stream && !m_connected ) { if ( (m_flags & wxSOCKET_WAITALL) || !total ) SetError(wxSOCKET_IOERR); @@ -1597,20 +1613,29 @@ void wxSocketBase::OnRequest(wxSocketNotify notification) case wxSOCKET_CONNECTION: flag = wxSOCKET_CONNECTION_FLAG; + + // we're now successfully connected + m_connected = true; + m_establishing = false; + + // error was previously set to wxSOCKET_WOULDBLOCK, but this is not + // the case any longer + SetError(wxSOCKET_NOERROR); break; case wxSOCKET_LOST: flag = wxSOCKET_LOST_FLAG; + + // if we lost the connection the socket is now closed and not + // connected any more + m_connected = false; + m_closed = true; break; default: wxFAIL_MSG( "unknown wxSocket notification" ); } - // if we lost the connection the socket is now closed - if ( notification == wxSOCKET_LOST ) - m_closed = true; - // remember the events which were generated for this socket, we're going to // use this in DoWait() m_eventsgot |= flag;