/* Like recv(), send(), ... */ int GSocket::Read(char *buffer, int size) { int ret; assert(this); if (m_fd == INVALID_SOCKET || m_server) { m_error = GSOCK_INVSOCK; return -1; } /* Disable events during query of socket status */ Disable(GSOCK_INPUT); /* If the socket is blocking, wait for data (with a timeout) */ if (Input_Timeout() == GSOCK_TIMEDOUT) /* We no longer return here immediately, otherwise socket events would not be re-enabled! */ ret = -1; else { /* Read the data */ if (m_stream) ret = Recv_Stream(buffer, size); else ret = Recv_Dgram(buffer, size); } if (ret == -1) { if ((errno == EWOULDBLOCK) || (errno == EAGAIN)) m_error = GSOCK_WOULDBLOCK; else m_error = GSOCK_IOERR; } /* Enable events again now that we are done processing */ Enable(GSOCK_INPUT); return ret; }
/* Like recv(), send(), ... */ int GSocket::Read(char *buffer, int size) { int ret; assert(this); /* Reenable INPUT events */ m_detected &= ~GSOCK_INPUT_FLAG; if (m_fd == INVALID_SOCKET || m_server) { m_error = GSOCK_INVSOCK; return -1; } /* If the socket is blocking, wait for data (with a timeout) */ if (Input_Timeout() == GSOCK_TIMEDOUT) { m_error = GSOCK_TIMEDOUT; return -1; } /* Read the data */ if (m_stream) ret = Recv_Stream(buffer, size); else ret = Recv_Dgram(buffer, size); if (ret == SOCKET_ERROR) { if (WSAGetLastError() != WSAEWOULDBLOCK) m_error = GSOCK_IOERR; else m_error = GSOCK_WOULDBLOCK; return -1; } return ret; }