/** * \brief 接收数据到缓冲区,保证在调用这个函数之前套接口准备好了接收,也就是使用poll轮询过 * 如果是加密包需要先解密到解密缓冲区 * \return 实际接收字节数 * 返回-1,表示接收错误 * 返回0,表示接收超时 * 返回整数,不加密时表示实际接收的字节数,加密时返回解密到的字节数 */ int CSocket::recvToBuf_NoPoll() { printf("CSocket::recvToBuf_NoPoll\n"); int retcode =0; _rcv_queue.wr_reserve(MAX_DATABUFFERSIZE); if( m_bUseIocp ) { retcode = _rcv_queue.rd_size(); } else { retcode = ::recv(sock,(char*)_rcv_queue.wr_buf(),_rcv_queue.wr_size(),MSG_NOSIGNAL); } if (retcode == -1 && (errno == EAGAIN || errno == EWOULDBLOCK)) return 0;//should retry if( retcode == 0 && m_bUseIocp ) return 0; if (retcode > 0) { success_recv(); } if (0 == retcode) return -1;//EOF return retcode; }
/** * \brief 接收数据到缓冲区,保证在调用这个函数之前套接口准备好了接收,也就是使用poll轮询过 * 如果是加密包需要先解密到解密缓冲区 * \return 实际接收字节数 * 返回-1,表示接收错误 * 返回0,表示接收超时 * 返回整数,不加密时表示实际接收的字节数,加密时返回解密到的字节数 */ int zSocket::recvToBuf_NoPoll() { //Zebra::logger->trace("zSocket::recvToBuf_NoPoll"); int retcode =0; if(need_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)) return 0;//should retry if (retcode > 0) success_recv_and_dec(); } else { _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)) return 0;//should retry if (retcode > 0) success_recv(); } if (0 == retcode) return -1;//EOF return retcode; }
/** * \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 接收数据到缓冲区 * 如果是加密包需要解密到解密缓冲区 * \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; }