* fhandler_socket.cc (fhandler_socket::sendto): Drop out of loop if
has_been_closed gets set. (fhandler_socket::sendmsg): Ditto. * net.cc (wsock_event::wait): Don't initialize evts. Don't try to evaluate network events if WSAEnumNetworkEvents fails. (wsock_event::release): Save last WSA error and set it again unless resetting to blocking socket fails. * wsock_event.h (class wsock_event): Remove destructor.
This commit is contained in:
@@ -75,32 +75,33 @@ wsock_event::wait (int sock, int &closed)
|
||||
{
|
||||
case WSA_WAIT_EVENT_0:
|
||||
WSANETWORKEVENTS evts;
|
||||
memset (&evts, 0, sizeof evts);
|
||||
WSAEnumNetworkEvents (sock, event, &evts);
|
||||
if (evts.lNetworkEvents & FD_READ)
|
||||
if (!WSAEnumNetworkEvents (sock, event, &evts))
|
||||
{
|
||||
if (evts.iErrorCode[FD_READ_BIT])
|
||||
wsa_err = evts.iErrorCode[FD_READ_BIT];
|
||||
else
|
||||
ret = 0;
|
||||
if (evts.lNetworkEvents & FD_READ)
|
||||
{
|
||||
if (evts.iErrorCode[FD_READ_BIT])
|
||||
wsa_err = evts.iErrorCode[FD_READ_BIT];
|
||||
else
|
||||
ret = 0;
|
||||
}
|
||||
else if (evts.lNetworkEvents & FD_WRITE)
|
||||
{
|
||||
if (evts.iErrorCode[FD_WRITE_BIT])
|
||||
wsa_err = evts.iErrorCode[FD_WRITE_BIT];
|
||||
else
|
||||
ret = 0;
|
||||
}
|
||||
if (evts.lNetworkEvents & FD_CLOSE)
|
||||
{
|
||||
closed = 1;
|
||||
if (!wsa_err && evts.iErrorCode[FD_CLOSE_BIT])
|
||||
wsa_err = evts.iErrorCode[FD_CLOSE_BIT];
|
||||
else
|
||||
ret = 0;
|
||||
}
|
||||
if (wsa_err)
|
||||
WSASetLastError (wsa_err);
|
||||
}
|
||||
else if (evts.lNetworkEvents & FD_WRITE)
|
||||
{
|
||||
if (evts.iErrorCode[FD_WRITE_BIT])
|
||||
wsa_err = evts.iErrorCode[FD_WRITE_BIT];
|
||||
else
|
||||
ret = 0;
|
||||
}
|
||||
if (evts.lNetworkEvents & FD_CLOSE)
|
||||
{
|
||||
closed = 1;
|
||||
if (!wsa_err && evts.iErrorCode[FD_CLOSE_BIT])
|
||||
wsa_err = evts.iErrorCode[FD_CLOSE_BIT];
|
||||
else
|
||||
ret = 0;
|
||||
}
|
||||
if (wsa_err)
|
||||
WSASetLastError (wsa_err);
|
||||
break;
|
||||
case WSA_WAIT_EVENT_0 + 1:
|
||||
WSASetLastError (WSAEINTR);
|
||||
@@ -114,10 +115,14 @@ wsock_event::wait (int sock, int &closed)
|
||||
void
|
||||
wsock_event::release (int sock)
|
||||
{
|
||||
int last_err = WSAGetLastError ();
|
||||
WSAEventSelect (sock, event, 0);
|
||||
WSACloseEvent (event);
|
||||
unsigned long non_block = 0;
|
||||
ioctlsocket (sock, FIONBIO, &non_block);
|
||||
if (ioctlsocket (sock, FIONBIO, &non_block))
|
||||
debug_printf ("return to blocking failed: %d", WSAGetLastError ());
|
||||
else
|
||||
WSASetLastError (last_err);
|
||||
}
|
||||
|
||||
WSADATA wsadata;
|
||||
|
Reference in New Issue
Block a user