ignored until there are no more events pending. This is because you can
have data waiting to be read, for example, even when the peer has already
closed the connection. This affects _Wait() and OnRequest().
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@5904
c3d73ce0-8a6f-49c7-b76d-
6d57e0e08775
//
// XXX: Should it honour the wxSOCKET_BLOCK flag ?
//
//
// 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;
wxSocketEventFlags flags)
{
GSocketEventFlags result;
{
result = GSocket_Select(m_socket, flags | GSOCK_LOST_FLAG);
{
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)
// Incoming connection (server) or connection established (client)
if (result & GSOCK_CONNECTION_FLAG)
if ((result & GSOCK_INPUT_FLAG) || (result & GSOCK_OUTPUT_FLAG))
{
timer.Stop();
return TRUE;
}
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;
// Wait more?
if ((timeout == 0) || (m_interrupt))
break;
- // 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.
//
// 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_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
// If we are in the middle of a R/W operation, do not
// propagate events to users. Also, filter 'late' events
+
+ case wxSOCKET_LOST:
+ Close();
+ break;
}
if (((m_neededreq & flag) == flag) && m_notify_state)
}
if (((m_neededreq & flag) == flag) && m_notify_state)