Пример #1
0
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;
}
Пример #2
0
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;
}