是否可以使用boost::asio同时发送多个不同的数据类型而无需强制转换?
目前,我正在用我所有的数据填充一个std::vector,然后用async_write发送它。我发送的所有数据包都有一个2字节的报头,这告诉接收者还有多少数据需要读取(如果有)。生成此std::vector的代码为:是否可以使用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<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中数据缓冲区的使用寿命。谢谢!这正是我的问题。在这段调试代码中,我没有仔细考虑我的内存管理,我只是假设问题出在其他地方。