Fixed bugs in error handling in CTCPSocket; previously was not
handling read errors at all and error handling for writes was never being used. Now the socket disconnects if a read or write fails on the socket for any reason except EINTR. Also added <netinet/in.h> to includes in CNetwork.h because it's needed on some platforms.
This commit is contained in:
parent
9102fb80b9
commit
cf13980bb8
|
@ -43,6 +43,7 @@ typedef int ssize_t;
|
|||
#endif
|
||||
|
||||
#if UNIX_LIKE
|
||||
# include <netinet/in.h>
|
||||
# include <netdb.h>
|
||||
# include <errno.h>
|
||||
#endif
|
||||
|
@ -183,9 +184,11 @@ public:
|
|||
#if WINDOWS_LIKE
|
||||
kEADDRINUSE = WSAEADDRINUSE,
|
||||
kECONNECTING = WSAEWOULDBLOCK,
|
||||
kEINTR = WSAEINTR,
|
||||
#elif UNIX_LIKE
|
||||
kEADDRINUSE = EADDRINUSE,
|
||||
kECONNECTING = EINPROGRESS,
|
||||
kEINTR = EINTR,
|
||||
#endif
|
||||
kNone = 0
|
||||
};
|
||||
|
|
|
@ -292,6 +292,12 @@ CTCPSocket::ioService()
|
|||
m_input->hangup();
|
||||
m_connected &= ~kRead;
|
||||
}
|
||||
else {
|
||||
// socket failed
|
||||
if (CNetwork::getsockerror() != CNetwork::kEINTR) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// write some data
|
||||
|
@ -303,14 +309,17 @@ CTCPSocket::ioService()
|
|||
|
||||
// write data
|
||||
const void* buffer = m_output->peek(n);
|
||||
n = (UInt32)CNetwork::write(m_fd, buffer, n);
|
||||
ssize_t n2 = (UInt32)CNetwork::write(m_fd, buffer, n);
|
||||
|
||||
// discard written data
|
||||
if (n > 0) {
|
||||
if (n2 > 0) {
|
||||
m_output->pop(n);
|
||||
}
|
||||
else if (n == (UInt32)-1 && CNetwork::getsockerror() == EPIPE) {
|
||||
return;
|
||||
else if (n2 < 0) {
|
||||
// socket failed
|
||||
if (CNetwork::getsockerror() != CNetwork::kEINTR) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue