Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以使用boost::asio同时发送多个不同的数据类型而无需强制转换?_Boost_Boost Asio - Fatal编程技术网

是否可以使用boost::asio同时发送多个不同的数据类型而无需强制转换?

是否可以使用boost::asio同时发送多个不同的数据类型而无需强制转换?,boost,boost-asio,Boost,Boost Asio,目前,我正在用我所有的数据填充一个std::vector,然后用async_write发送它。我发送的所有数据包都有一个2字节的报头,这告诉接收者还有多少数据需要读取(如果有)。生成此std::vector的代码为: std::vector<boost::asio::const_buffer> BasePacket::buffer() { std::vector<boost::asio::const_buffer> buffers; buffers.push_ba

目前,我正在用我所有的数据填充一个std::vector,然后用async_write发送它。我发送的所有数据包都有一个2字节的报头,这告诉接收者还有多少数据需要读取(如果有)。生成此std::vector的代码为:

std::vector<boost::asio::const_buffer> BasePacket::buffer()
{
  std::vector<boost::asio::const_buffer> buffers;
  buffers.push_back(boost::asio::buffer(headerBytes_)); // This is just a boost::array<uint8_t, 2>
  return buffers;
}

std::vector<boost::asio::const_buffer> UpdatePacket::buffer()
{
  printf("Making an update packet into a buffer.\n");
  std::vector<boost::asio::const_buffer> buffers = BasePacket::buffer();
  boost::array<uint16_t, 2> test = { 30, 40 };
  buffers.push_back(boost::asio::buffer(test));
  return buffers;
}
std::vector BasePacket::buffer()
{
向量缓冲器;
buffers.push_back(boost::asio::buffer(headerBytes);//这只是一个boost::数组
返回缓冲区;
}
std::vector UpdatePackage::buffer()
{
printf(“将更新包放入缓冲区。\n”);
std::vector buffers=BasePacket::buffer();
阵列测试={30,40};
buffers.push_back(boost::asio::buffer(test));
返回缓冲区;
}
本文件由以下人员阅读:

void readHeader(const boost::system::error_code& error, size_t bytesTransferred)
{
  if(error)
  {
    printf("Error reading header: %s\n", error.message().c_str());
    return;
  }

  // At this point 2 bytes have been read into boost::array<uint8_t, 2> header
  uint8_t primeByte = header.data()[0];
  uint8_t supByte = header.data()[1];

  switch(primeByte)
  {
    // Unrelated case removed
    case PACKETHEADER::UPDATE:
      // Read the first 4 bytes as two 16-bit numbers representing the size of
      // the update
      boost::array<uint16_t, 2> buf;
      printf("Attempting to read the first two Uint16's.\n");
      boost::asio::read(mySocket, boost::asio::buffer(buf));
      printf("The update has size %d x %d\n", buf.data()[0], buf.data()[1]);
      break;
  }

  // Keep listening
  boost::asio::async_read(mySocket, boost::asio::buffer(header),
    boost::bind(readHeader, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
}
void readHeader(const boost::system::error\u code&error,size\u t bytesttransfered)
{
如果(错误)
{
printf(“读取标题时出错:%s\n”,Error.message().c_str());
返回;
}
//此时,已将2个字节读入boost::array标头
uint8_t primeByte=header.data()[0];
uint8_t supByte=header.data()[1];
开关(原始字节)
{
//无关个案移走
案例PACKETHEADER::更新:
//将前4个字节读取为两个16位数字,表示
//更新
boost::阵列buf;
printf(“尝试读取前两个Uint16。\n”);
boost::asio::read(mySocket,boost::asio::buffer(buf));
printf(“更新大小为%d x%d\n”,buf.data()[0],buf.data()[1]);
打破
}
//继续听
boost::asio::async_read(mySocket,boost::asio::buffer(标头),
boost::bind(readHeader,boost::asio::placeholders::error,boost::asio::placeholders::bytes_transfer));
}
代码可以编译,但是它不会像我预期的那样返回30x40。相反,它又回来了 188x40。如果我拉伸第二个数组,只有第一个字节出错。但是,如果在发送之前添加第三个数组(但仍然读取发送量),则第二个数组的值都会出错。我猜这可能与我如何读取它有关(在一个缓冲区中分块读取,而不是类似于我如何编写它)


理想情况下,我希望避免将所有内容都转换为字节,并以这种方式读/写,因为它不太清晰,可能不太便于携带,但我知道这是一种选择。但是,如果有更好的方法,我可以重写我现有的内容。

我看到的第一个问题是您发送的数据存在一个终生问题。asio::buffers只需包装您继续拥有的数据缓冲区

UpdatePacket::buffer()方法创建一个boost::数组,它对该数组进行包装,然后将其推回buffers std::vector。当该方法退出时,boost::array超出范围,asio::buffer现在指向垃圾


也许还有其他问题,但这是一个好的开始。请注意Asio中数据缓冲区的使用寿命。

谢谢!这正是我的问题。在这段调试代码中,我没有仔细考虑我的内存管理,我只是假设问题出在其他地方。