Beispiel #1
0
/**
* \brief 接收指令到缓冲区
* \param pstrCmd 指令缓冲区
* \param nCmdLen 指令缓冲区的大小
* \param wait 当套接口数据没有准备好的时候,是否需要等待
* \return 实际接收的指令大小
*       返回-1,表示接收错误
*       返回0,表示接收超时
*       返回整数,表示实际接收的字节数
*/
int CSocket::recvToCmd(void *pstrCmd,const int nCmdLen,const bool wait)
{
	//printf("CSocket::recvToCmd\n");
	//够一个完整的纪录,不需要向套接口接收数据
	do { 
		if (_rcv_raw_size >= packetMinSize()/* && _rcv_queue.rd_size() >= packetMinSize()*/) 
		{ 
			DWORD nRecordLen = packetSize(&_rcv_queue.rd_buf()[PACKHEADSIZE]); 
			if (_rcv_raw_size >= nRecordLen/* && _rcv_queue.rd_size() >= nRecordLen*/) 
			{ 
				int retval = packetUnpack(_rcv_queue.rd_buf(),nRecordLen,(BYTE*)pstrCmd); 
				_rcv_queue.rd_flip(nRecordLen + PACKHEADLASTSIZE); 
				InterlockedExchangeAdd( (LONG*)&_rcv_raw_size, -( nRecordLen + PACKHEADLASTSIZE)); 
				return retval; 
			} 
		}
		else
		{
			break;
		}
	} while(0);

	do {
		int retval = recvToBuf();
		if (-1 == retval || (0 == retval && !wait))
			return retval;

		//够一个完整的纪录,不需要向套接口接收数据
		do { 
			if (_rcv_raw_size >= packetMinSize()/* && _rcv_queue.rd_size() >= packetMinSize()*/) 
			{ 
				DWORD nRecordLen = packetSize(&_rcv_queue.rd_buf()[PACKHEADSIZE]); 
				if (_rcv_raw_size >= nRecordLen/* && _rcv_queue.rd_size() >= nRecordLen*/) 
				{ 
					int retval = packetUnpack(_rcv_queue.rd_buf(),nRecordLen,(BYTE*)pstrCmd); 
					_rcv_queue.rd_flip(nRecordLen + PACKHEADLASTSIZE); 
					InterlockedExchangeAdd((LONG*)&_rcv_raw_size, -( nRecordLen + PACKHEADLASTSIZE )); 
					return retval; 
				} 
			}
			else
			{
				break;
			}
		} while(0);
	} while(true);

	return 0;
}
Beispiel #2
0
DWORD Socket::successUnpack(void *cmd)
{
	DWORD retval = 0;
	//有消息还没有读出来
	CheckConditonReturn(m_recvRawSize >= packetMinSize(),0);
	//理论上消息的长度
	DWORD recordLen = packetSize(m_recvQueue.rdBuffer());
	if(m_recvRawSize >= recordLen)
	{
		retval = packetUnpack(m_recvQueue.rdBuffer(),recordLen,(BYTE*)cmd);
		m_recvQueue.rdFlip(recordLen);
		m_recvRawSize -= recordLen;
	}
	return retval;
}
Beispiel #3
0
/**
* \brief 接收指令到缓冲区,不从套接口接收指令,只是把接收缓冲的数据解包
* \param pstrCmd 指令缓冲区
* \param nCmdLen 指令缓冲区的大小
* \return 实际接收的指令大小
*       返回-1,表示接收错误
*       返回0,表示接收超时
*       返回整数,表示实际接收的字节数
*/
int CSocket::recvToCmd_NoPoll(void *pstrCmd,const int nCmdLen)
{
	printf("CSocket::recvToCmd_NoPoll\n");
	//够一个完整的纪录,不需要向套接口接收数据
	do { 
		if (_rcv_raw_size >= packetMinSize()/* && _rcv_queue.rd_size() >= packetMinSize()*/) 
		{ 
			DWORD nRecordLen = packetSize(_rcv_queue.rd_buf() + PACKHEADSIZE); 
			if (_rcv_raw_size >= nRecordLen/* && _rcv_queue.rd_size() >= nRecordLen*/) 
			{ 
				int retval = packetUnpack(_rcv_queue.rd_buf(),nRecordLen,(BYTE*)pstrCmd); 
				_rcv_queue.rd_flip(nRecordLen + PACKHEADLASTSIZE); 
				InterlockedExchangeAdd((LONG*)&_rcv_raw_size, -( nRecordLen + PACKHEADLASTSIZE )); 
				return retval; 
			} 
			else
			{
				printf("处理错误的包!\n");
			}
		} 
	} while(0);
	return 0;
}