diff --git a/src/common/socket.cpp b/src/common/socket.cpp index 0058d50318..330868a178 100644 --- a/src/common/socket.cpp +++ b/src/common/socket.cpp @@ -635,7 +635,8 @@ void wxSocketBase::RestoreState() // // XXX: Should it honour the wxSOCKET_BLOCK flag ? // -bool wxSocketBase::_Wait(long seconds, long milliseconds, +bool wxSocketBase::_Wait(long seconds, + long milliseconds, wxSocketEventFlags flags) { GSocketEventFlags result; @@ -683,13 +684,10 @@ bool wxSocketBase::_Wait(long seconds, long milliseconds, { result = GSocket_Select(m_socket, flags | GSOCK_LOST_FLAG); - // Connection lost - if (result & GSOCK_LOST_FLAG) - { - timer.Stop(); - Close(); - return TRUE; - } + // The order in which we check events is important; in particular, + // GSOCKET_LOST events should be checked last (there might be still + // data to read in the incoming queue even after the peer has closed + // the connection). // Incoming connection (server) or connection established (client) if (result & GSOCK_CONNECTION_FLAG) @@ -700,12 +698,21 @@ bool wxSocketBase::_Wait(long seconds, long milliseconds, return TRUE; } + // Input and output if ((result & GSOCK_INPUT_FLAG) || (result & GSOCK_OUTPUT_FLAG)) { timer.Stop(); return TRUE; } + // Connection lost + if (result & GSOCK_LOST_FLAG) + { + timer.Stop(); + Close(); + return TRUE; + } + // Wait more? if ((timeout == 0) || (m_interrupt)) break; @@ -828,18 +835,20 @@ void wxSocketBase::OnRequest(wxSocketNotify req_evt) switch (req_evt) { - // This duplicates some code in _Wait(), but this doesn't - // hurt. It has to be here because we don't know whether - // WaitXXX will be used, and it has to be in _Wait as well + // This duplicates some code in _Wait(), but this doesn't hurt. + // It has to be here because we don't know whether the Wait() + // functions will be used, and it has to be in _Wait as well // because the event might be a bit delayed. // + // The order in which we check events is important; in particular, + // GSOCKET_LOST events should be checked last (there might be still + // data to read in the incoming queue even after the peer has + // closed the connection). + case wxSOCKET_CONNECTION : m_establishing = FALSE; m_connected = TRUE; break; - case wxSOCKET_LOST: - Close(); - break; // If we are in the middle of a R/W operation, do not // propagate events to users. Also, filter 'late' events @@ -856,6 +865,10 @@ void wxSocketBase::OnRequest(wxSocketNotify req_evt) return; else break; + + case wxSOCKET_LOST: + Close(); + break; } if (((m_neededreq & flag) == flag) && m_notify_state)