コード例 #1
0
ファイル: Socket.cpp プロジェクト: edolphin-ydf/hydzhengtu
/**
* \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;
}
コード例 #2
0
ファイル: baseSocket.cpp プロジェクト: flyerSon/Project
SWORD Socket::recvToCmd(void *cmd,const bool wait)
{
	SWORD retval = successUnpack(cmd);
	CheckConditonReturn(!retval,retval);
	do
	{
		retval = recvToBuf();
		//套接字出错或者没有接收到数据且不等待
		if(retval == -1 || (!retval && !wait))
		{
			return retval;
		}
		retval = successUnpack(cmd);
		CheckConditonReturn(!retval,retval);	
	}while(true);
	return 0;
}
コード例 #3
0
ファイル: zSocket.cpp プロジェクト: xiongshaogang/Svr-15-11-4
/**
 * \brief 接收指令到缓冲区
 * \param pstrCmd 指令缓冲区
 * \param nCmdLen 指令缓冲区的大小
 * \param wait 当套接口数据没有准备好的时候,是否需要等待
 * \return 实际接收的指令大小
 * 			返回-1,表示接收错误
 * 			返回0,表示接收超时
 * 			返回整数,表示实际接收的字节数
 */
int zSocket::recvToCmd(void *pstrCmd, const int nCmdLen, const bool wait)
{
	//Zebra::logger->trace("zSocket::recvToCmd");
	//够一个完整的纪录,不需要向套接口接收数据
	success_unpack();

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

		//够一个完整的纪录,不需要向套接口接收数据
		success_unpack();
	} while(true);

	return 0;
}