/**
 * \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;
}
Exemple #2
0
/**
* \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;
}
Exemple #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;
}