2011-04-26 20 views
0

目前我用所有的數據填充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.如果我拉伸第二個陣列只有第一個字節搞砸了。但是,如果在發送之前添加第三個數組(但仍讀取發送數量),則第二個數組的值都會變得混亂。我猜測這可能與我正在閱讀的內容有關(以塊的形式放入一個緩衝區,而不是類似於我的寫法)。

理想情況下,我希望避免必須將所有內容都轉換爲字節並以這種方式進行讀/寫,因爲它不夠清晰,可能便攜性較差,但我知道這是一個選項。但是,如果有更好的方法,我很好的重寫我的東西。

回答

1

我看到的第一個問題是您發送的數據的一生問題。 asio :: buffers只是簡單地包裝一個你繼續擁有的數據緩衝區。

UpdatePacket :: buffer()方法創建了一個boost :: array,它將其封裝,然後將其推回緩衝區std :: vector。當方法退出時,boost :: array超出範圍,asio :: buffer現在指向垃圾。

還有其他問題,但這是一個好的開始。關注Asio中數據緩衝區的生命週期。

+0

謝謝!這正是我的問題。在這個調試代碼中,我沒有仔細考慮過我的內存管理,我只是假設問題必須在其他地方。 – rofer 2011-04-26 22:33:01

相關問題