2011-04-08 132 views
3

反正基本上做到以下幾點:C++的boost :: ASIO ::緩衝和結構

#include <boost/asio.hpp> 

struct testStruct{ 
    int x; 
    int y; 
}; 

int main(){ 
    struct testStruct t; 
    boost::asio::buffer b; 
    b = boost::asio::buffer(t); 
    return 0; 
} 

它似乎失敗是通過「T」到緩衝區,「B」。

回答

6

使用較多的scatter操作多單緩衝:

#include <boost/asio.hpp> 

#include <vector> 

struct testStruct{ 
    int x; 
    int y; 
}; 

int 
main() 
{ 
    struct testStruct t; 
    t.x = 5; 
    t.y = 7; 

    std::vector<boost::asio::const_buffer> buffers; 
    buffers.push_back(boost::asio::buffer(&t.x, sizeof(t.x))); 
    buffers.push_back(boost::asio::buffer(&t.y, sizeof(t.y))); 

    boost::asio::io_service io_service; 
    boost::asio::ip::tcp::socket socket(io_service); // note not connected! 
    std::size_t length = boost::asio::write(socket, buffers); 

    return 0; 
} 

注意,您需要使用相應的收集有關接收方。除了你提出的人爲的例子之外,這會變得非常乏味。這就是爲什麼I suggested在您的previous question中使用更強大的序列化機制。

+0

對!這看起來很乏味......我只是試圖感受我的選擇。感謝您的繼續幫助! – Andrew 2011-04-08 20:15:30

+0

@安德魯沒問題,樂於幫忙!在遇到它們時繼續提問,這就是Stackoverflow的用途。 – 2011-04-08 20:20:57

+3

'boost :: asio :: buffer(&t,sizeof(t))'會更有效率。如果需要打開/關閉包裝。 – 2011-04-08 20:41:52

2

有幾件事情你需要小心。

1.填充

你的結構佈局是實現特定的。在服務器的結構的x和y成員之間存在佔位符字節是完全可能的,而客戶端上則沒有。

要解決這個問題,您應該按照成員序列化您的結構成員到字符緩衝區,並以相同的方式在客戶端反序列化它們。

你可以寫一些程序代碼,以幫助您完成此,這裏是一個起點:

class packet_writer 
{ 
public: 
    template <typename iter> void write(iter begin, iter end) 
    { 
     buffer_.insert(buffer_.end(), begin, end); 
    } 

    template <typename T> void write(T data) 
    { 
      int8_t* begin = reinterpret_cast<int8_t*>(&data); 
     write(begin, begin + sizeof(data)); 
    } 

    const std::vector<int8_t>& buffer() const 
    { 
     return buffer_; 
    } 

private: 
    std::vector<int8_t> buffer_; 
}; 

2字節序

取決於架構,或在某些情況下甚至取決於當前CPU模式(某些POWER CPU支持字節序切換),您的成員字節可能會顛倒。您必須檢測主機體系結構的字節順序,並將字節交換爲預定義順序,以便在協議中使用。