/** * \brief 接收数据到缓冲区 * 如果是加密包需要解密到解密缓冲区 * \return 实际接收字节数 * 返回-1,表示接收错误 * 返回0,表示接收超时 * 返回整数,不加密包表示实际接收的字节数,加密包返回解密后实际可用的字节数 */ int zSocket::recvToBuf() { //Zebra::logger->trace("zSocket::recvToBuf"); int retcode = 0; if(need_enc()) { if (isset_flag(INCOMPLETE_READ)) { clear_flag(INCOMPLETE_READ); goto do_select_enc; } _rcv_queue.wr_reserve(MAX_DATABUFFERSIZE); retcode = TEMP_FAILURE_RETRY(::recv(sock, _rcv_queue.wr_buf(), _rcv_queue.wr_size(), MSG_NOSIGNAL)); if (retcode == -1 && (errno == EAGAIN || errno == EWOULDBLOCK)) { do_select_enc: retcode = waitForRead(); if (1 == retcode) retcode = TEMP_FAILURE_RETRY(::recv(sock, _rcv_queue.wr_buf(), _rcv_queue.wr_size(), MSG_NOSIGNAL)); else return retcode; } if (retcode > 0) success_recv_and_dec(); } else { if (isset_flag(INCOMPLETE_READ)) { clear_flag(INCOMPLETE_READ); goto do_select; } _rcv_queue.wr_reserve(MAX_DATABUFFERSIZE); retcode = TEMP_FAILURE_RETRY(::recv(sock, _rcv_queue.wr_buf(), _rcv_queue.wr_size(), MSG_NOSIGNAL)); if (retcode == -1 && (errno == EAGAIN || errno == EWOULDBLOCK)) { do_select: retcode = waitForRead(); if (1 == retcode) retcode = TEMP_FAILURE_RETRY(::recv(sock, _rcv_queue.wr_buf(), _rcv_queue.wr_size(), MSG_NOSIGNAL)); else return retcode; } if (retcode > 0) success_recv(); } if (0 == retcode) return -1;//EOF return retcode; }
/** * \brief 向套接口发送原始数据,没有打包的数据,一般发送数据的时候需要加入额外的包头 * \param pBuffer 待发送的原始数据 * \param nSize 待发送的原始数据大小 * \return 实际发送的字节数 * 返回-1,表示发送错误 * 返回0,表示发送超时 * 返回整数,表示实际发送的字节数 */ int CSocket::sendRawData(const void *pBuffer,const int nSize) { if (isset_flag(INCOMPLETE_WRITE)) { clear_flag(INCOMPLETE_WRITE); goto do_select; } if( nSize > 10000 ) { int iii = 0; } int retcode = Send(sock,(const char*)pBuffer,nSize,MSG_NOSIGNAL); if (retcode == -1 && (errno == EAGAIN || errno == EWOULDBLOCK)) { do_select: retcode = waitForWrite(); if (1 == retcode) { mutex.lock(); retcode = Send(sock,(const char*)pBuffer,nSize,MSG_NOSIGNAL); mutex.unlock(); } else return retcode; } if (retcode > 0 && retcode < nSize) set_flag(INCOMPLETE_WRITE); return retcode; }
/** * \brief 向套接口发送原始数据,没有打包的数据,一般发送数据的时候需要加入额外的包头 * \param pBuffer 待发送的原始数据 * \param nSize 待发送的原始数据大小 * \return 实际发送的字节数 * 返回-1,表示发送错误 * 返回0,表示发送超时 * 返回整数,表示实际发送的字节数 */ int zSocket::sendRawData(const void *pBuffer, const int nSize) { int retcode = 0; //Zebra::logger->trace("zSocket::sendRawData"); if (isset_flag(INCOMPLETE_WRITE)) { clear_flag(INCOMPLETE_WRITE); goto do_select; } retcode = TEMP_FAILURE_RETRY(::send(sock, pBuffer, nSize, MSG_NOSIGNAL)); if (retcode == -1 && (errno == EAGAIN || errno == EWOULDBLOCK)) { do_select: retcode = waitForWrite(); if (1 == retcode) retcode = TEMP_FAILURE_RETRY(::send(sock, pBuffer, nSize, MSG_NOSIGNAL)); else return retcode; } if (retcode > 0 && retcode < nSize) set_flag(INCOMPLETE_WRITE); return retcode; }
/** * \brief 接收数据到缓冲区 * 如果是加密包需要解密到解密缓冲区 * \return 实际接收字节数 * 返回-1,表示接收错误 * 返回0,表示接收超时 * 返回整数,不加密包表示实际接收的字节数,加密包返回解密后实际可用的字节数 */ int CSocket::recvToBuf() { //printf("CSocket::recvToBuf\n"); int retcode = 0; if (isset_flag(INCOMPLETE_READ)) { clear_flag(INCOMPLETE_READ); goto do_select; } _rcv_queue.wr_reserve(MAX_DATABUFFERSIZE); if( m_bUseIocp ) { retcode = WaitRecv( true, rd_msec / 1000 ); if( retcode <= 0 ) return retcode; } else { retcode = ::recv(sock,(char*)_rcv_queue.wr_buf(),_rcv_queue.wr_size(),MSG_NOSIGNAL); } if ( retcode == -1 && (errno == EAGAIN || errno == EWOULDBLOCK) && !m_bUseIocp ) { do_select: if( m_bUseIocp ) { retcode = WaitRecv( true, rd_msec / 1000 ); if( retcode <= 0 ) return retcode; } else { retcode = waitForRead(); if (1 == retcode) retcode = ::recv(sock,(char*)_rcv_queue.wr_buf(),_rcv_queue.wr_size(),MSG_NOSIGNAL); else return retcode; } } if (retcode > 0) success_recv(); if (0 == retcode) return -1;//EOF return retcode; }