//
// 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;
{
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)
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;
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
return;
else
break;
+
+ case wxSOCKET_LOST:
+ Close();
+ break;
}
if (((m_neededreq & flag) == flag) && m_notify_state)