int GSocket::Write(const char *buffer, int size) { int ret; assert(this); GSocket_Debug(( "GSocket_Write #1, size %d\n", size )); if (m_fd == INVALID_SOCKET || m_server) { m_error = GSOCK_INVSOCK; return -1; } GSocket_Debug(( "GSocket_Write #2, size %d\n", size )); /* If the socket is blocking, wait for writability (with a timeout) */ if (Output_Timeout() == GSOCK_TIMEDOUT) return -1; GSocket_Debug(( "GSocket_Write #3, size %d\n", size )); /* Write the data */ if (m_stream) ret = Send_Stream(buffer, size); else ret = Send_Dgram(buffer, size); GSocket_Debug(( "GSocket_Write #4, size %d\n", size )); if (ret == -1) { if ((errno == EWOULDBLOCK) || (errno == EAGAIN)) { m_error = GSOCK_WOULDBLOCK; GSocket_Debug(( "GSocket_Write error WOULDBLOCK\n" )); } else { m_error = GSOCK_IOERR; GSocket_Debug(( "GSocket_Write error IOERR\n" )); } /* Only reenable OUTPUT events after an error (just like WSAAsyncSelect * in MSW). Once the first OUTPUT event is received, users can assume * that the socket is writable until a read operation fails. Only then * will further OUTPUT events be posted. */ Enable(GSOCK_OUTPUT); return -1; } GSocket_Debug(( "GSocket_Write #5, size %d ret %d\n", size, ret )); return ret; }
int GSocket::Write(const char *buffer, int size) { int ret; assert(this); if (m_fd == INVALID_SOCKET || m_server) { m_error = GSOCK_INVSOCK; return -1; } /* If the socket is blocking, wait for writability (with a timeout) */ if (Output_Timeout() == GSOCK_TIMEDOUT) return -1; /* Write the data */ if (m_stream) ret = Send_Stream(buffer, size); else ret = Send_Dgram(buffer, size); if (ret == SOCKET_ERROR) { if (WSAGetLastError() != WSAEWOULDBLOCK) m_error = GSOCK_IOERR; else m_error = GSOCK_WOULDBLOCK; /* Only reenable OUTPUT events after an error (just like WSAAsyncSelect * does). Once the first OUTPUT event is received, users can assume * that the socket is writable until a read operation fails. Only then * will further OUTPUT events be posted. */ m_detected &= ~GSOCK_OUTPUT_FLAG; return -1; } return ret; }