void *Connection::recvData(uint32_t *out_len, void *header_data) { void *out_data = nullptr; while (1) { out_data = _recvData(out_len, header_data); // If we just handled something private. if (!out_data && *out_len == (uint32_t)-1) { continue; } break; } return out_data; }
int Packet::assemble(char * data, int size) { int lsize = 0, rsize = 0, wsize = 0; while ((lsize = size - rsize) > 0) { if (_getHeadLeftSize() > 0) //包头未满,把包头写满 { wsize = _getHeadLeftSize() < lsize ? _getHeadLeftSize() : lsize; } else if (_getLeftSize() > 0) //包数据未满,把整个包写满 { wsize = _getLeftSize() < lsize ? _getLeftSize() : lsize; } _recvData(data + rsize, wsize); rsize += wsize; if (_getLeftSize() == 0) //已摘出一个完整包 { if (!_crcCheck()) //完整性校验 { LOGGER_ERROR("crcCheck failed sock=%d size=%d lsize=%d rsize=%d", sock, size, lsize, rsize); return 0; } else { return rsize; } } else if (_getLeftSize() < 0) { LOGGER_ERROR("_getLeftSize() < 0 sock=%d", sock); return 0; } } return rsize; }