目前我用所有的數據填充std :: vector,然後用async_write發送它。我發送的所有數據包都有一個2字節的標題,這告訴接收方要讀多少(如果有的話)。產生這種的std ::向量的代碼是:是否可以一次使用boost :: asio發送多個不同的數據類型而無需投射?
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;
}
這是通過閱讀:
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));
}
代碼編譯,但它不包退,30×40像我期望的那樣。相反,它返回 188 x 40.如果我拉伸第二個陣列只有第一個字節搞砸了。但是,如果在發送之前添加第三個數組(但仍讀取發送數量),則第二個數組的值都會變得混亂。我猜測這可能與我正在閱讀的內容有關(以塊的形式放入一個緩衝區,而不是類似於我的寫法)。
理想情況下,我希望避免必須將所有內容都轉換爲字節並以這種方式進行讀/寫,因爲它不夠清晰,可能便攜性較差,但我知道這是一個選項。但是,如果有更好的方法,我很好的重寫我的東西。
謝謝!這正是我的問題。在這個調試代碼中,我沒有仔細考慮過我的內存管理,我只是假設問題必須在其他地方。 – rofer 2011-04-26 22:33:01