有幾件事情你需要小心。
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支持字節序切換),您的成員字節可能會顛倒。您必須檢測主機體系結構的字節順序,並將字節交換爲預定義順序,以便在協議中使用。
來源
2011-04-08 20:34:08
xDD
對!這看起來很乏味......我只是試圖感受我的選擇。感謝您的繼續幫助! – Andrew 2011-04-08 20:15:30
@安德魯沒問題,樂於幫忙!在遇到它們時繼續提問,這就是Stackoverflow的用途。 – 2011-04-08 20:20:57
'boost :: asio :: buffer(&t,sizeof(t))'會更有效率。如果需要打開/關閉包裝。 – 2011-04-08 20:41:52