/** * \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; }
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; }
/** * \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; }