Rearrange and simplify read and error checks, and remove use of MSG_PEEK that is unneeded and not supported on CE anyway [ Modified & Expanded Patch 1428745 ]
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@37667 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -848,30 +848,28 @@ GSocketEventFlags GSocket::Select(GSocketEventFlags flags)
|
|||||||
return (result & flags);
|
return (result & flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check for readability */
|
/* Check for exceptions and errors */
|
||||||
if (FD_ISSET(m_fd, &readfds))
|
if (FD_ISSET(m_fd, &exceptfds))
|
||||||
{
|
{
|
||||||
char c;
|
|
||||||
|
|
||||||
if (!m_stream || recv(m_fd, &c, 1, MSG_PEEK) > 0)
|
|
||||||
{
|
|
||||||
result |= GSOCK_INPUT_FLAG;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (m_server && m_stream)
|
|
||||||
{
|
|
||||||
result |= GSOCK_CONNECTION_FLAG;
|
|
||||||
m_detected |= GSOCK_CONNECTION_FLAG;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
m_detected = GSOCK_LOST_FLAG;
|
|
||||||
m_establishing = false;
|
m_establishing = false;
|
||||||
|
m_detected = GSOCK_LOST_FLAG;
|
||||||
|
|
||||||
/* LOST event: Abort any further processing */
|
/* LOST event: Abort any further processing */
|
||||||
return (GSOCK_LOST_FLAG & flags);
|
return (GSOCK_LOST_FLAG & flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Check for readability */
|
||||||
|
if (FD_ISSET(m_fd, &readfds))
|
||||||
|
{
|
||||||
|
result |= GSOCK_INPUT_FLAG;
|
||||||
|
|
||||||
|
if (m_server && m_stream)
|
||||||
|
{
|
||||||
|
/* This is a TCP server socket that detected a connection.
|
||||||
|
While the INPUT_FLAG is also set, it doesn't matter on
|
||||||
|
this kind of sockets, as we can only Accept() from them. */
|
||||||
|
result |= GSOCK_CONNECTION_FLAG;
|
||||||
|
m_detected |= GSOCK_CONNECTION_FLAG;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -906,16 +904,6 @@ GSocketEventFlags GSocket::Select(GSocketEventFlags flags)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check for exceptions and errors (is this useful in Unices?) */
|
|
||||||
if (FD_ISSET(m_fd, &exceptfds))
|
|
||||||
{
|
|
||||||
m_establishing = false;
|
|
||||||
m_detected = GSOCK_LOST_FLAG;
|
|
||||||
|
|
||||||
/* LOST event: Abort any further processing */
|
|
||||||
return (GSOCK_LOST_FLAG & flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
return (result & flags);
|
return (result & flags);
|
||||||
}
|
}
|
||||||
else /* USE_GUI() */
|
else /* USE_GUI() */
|
||||||
|
@@ -1213,37 +1213,28 @@ GSocketEventFlags GSocket::Select(GSocketEventFlags flags)
|
|||||||
return (result & flags);
|
return (result & flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check for readability */
|
/* Check for exceptions and errors */
|
||||||
if (wxFD_ISSET(m_fd, &readfds))
|
if (wxFD_ISSET(m_fd, &exceptfds))
|
||||||
{
|
{
|
||||||
char c;
|
|
||||||
|
|
||||||
int num = recv(m_fd, &c, 1, MSG_PEEK | GSOCKET_MSG_NOSIGNAL);
|
|
||||||
|
|
||||||
if (num > 0)
|
|
||||||
{
|
|
||||||
result |= GSOCK_INPUT_FLAG;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (m_server && m_stream)
|
|
||||||
{
|
|
||||||
result |= GSOCK_CONNECTION_FLAG;
|
|
||||||
m_detected |= GSOCK_CONNECTION_FLAG;
|
|
||||||
}
|
|
||||||
/* If recv returned zero, then the connection is lost, and errno is not set.
|
|
||||||
* Otherwise, recv has returned an error (-1), in which case we have lost the
|
|
||||||
* socket only if errno does _not_ indicate that there may be more data to read.
|
|
||||||
*/
|
|
||||||
else if (num == 0 ||
|
|
||||||
(errno != EWOULDBLOCK) && (errno != EAGAIN) && (errno != EINTR))
|
|
||||||
{
|
|
||||||
m_detected = GSOCK_LOST_FLAG;
|
|
||||||
m_establishing = false;
|
m_establishing = false;
|
||||||
|
m_detected = GSOCK_LOST_FLAG;
|
||||||
|
|
||||||
/* LOST event: Abort any further processing */
|
/* LOST event: Abort any further processing */
|
||||||
return (GSOCK_LOST_FLAG & flags);
|
return (GSOCK_LOST_FLAG & flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Check for readability */
|
||||||
|
if (wxFD_ISSET(m_fd, &readfds))
|
||||||
|
{
|
||||||
|
result |= GSOCK_INPUT_FLAG;
|
||||||
|
|
||||||
|
if (m_server && m_stream)
|
||||||
|
{
|
||||||
|
/* This is a TCP server socket that detected a connection.
|
||||||
|
While the INPUT_FLAG is also set, it doesn't matter on
|
||||||
|
this kind of sockets, as we can only Accept() from them. */
|
||||||
|
result |= GSOCK_CONNECTION_FLAG;
|
||||||
|
m_detected |= GSOCK_CONNECTION_FLAG;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1278,16 +1269,6 @@ GSocketEventFlags GSocket::Select(GSocketEventFlags flags)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check for exceptions and errors (is this useful in Unices?) */
|
|
||||||
if (wxFD_ISSET(m_fd, &exceptfds))
|
|
||||||
{
|
|
||||||
m_establishing = false;
|
|
||||||
m_detected = GSOCK_LOST_FLAG;
|
|
||||||
|
|
||||||
/* LOST event: Abort any further processing */
|
|
||||||
return (GSOCK_LOST_FLAG & flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
return (result & flags);
|
return (result & flags);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user