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