示例#1
0
/**
* \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;
}
示例#2
0
/**
 * \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;
}
示例#3
0
/**
 * \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;
}
示例#4
0
/**
* \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;
}