c++ - socket - udp tcp server




通過c套接字發送結構 (3)

結構中的所有數據都與memset無效,所以我假設結構的大小始終是不變的。

這沒有什麼意義。 對象總是有一個固定的大小。 “與memset無效”與它無關。

它是安全的發送C結構的C套接字和另一端的memset接收數據?

不,不是。

最好考慮發送“數據”,而不是在內存中的對象的確切的,按字節的物理內容。

我可能遇到什麼問題?

  • 成員填充
  • 數據對齊
  • 類型大小
  • 字節序
  • 間接 - 指向數據的指針而不是數據本身

更有經驗的程序員如何接近這一點?

最好做好序列化。

創建一個數據格式,您的應用程序無論在哪台機器上都能識別,並用它來表示您的聊天數據。

  1. 有時為了提高效率,您必須設計一個二進制格式,並使用巧妙,強大的技術在目標機器上正確地反序列化信息,並考慮到上述考慮因素。

  2. 但是,對於簡單的工作,您可以使用人類可讀的文本格式。 不能真的出問題了。

我正在構建一個UDP聊天應用程序。 它是安全的發送C結構的C套接字和另一端的memset接收數據? 結構中的所有數據都與memset無效,所以我假設結構的大小始終是不變的。 我可能遇到什麼問題?

更有經驗的程序員如何接近這一點?


不過,你這樣做,單元測試了它。 編譯器和平台在這些方面差異很大,所以千萬不要盲目地認為它是一致的。

編譯器可能會隨時改變結構對齊(例如,出於性能原因)。 尋求一些限制通常是編譯器特定的,儘管MSVC和gcc(通過擴展)支持這個限制,

#pragma pack(push, 1)
struct Foo {
  // ..
};
#pragma pack(pop)

這迫使它在1字節邊界上對齊,所以沒有布爾值。

如果你想完全符合,然後自己序列化每個領域。 這真的不是所有的工作。

正如其他人所說的那樣,你還必須處理排序問題。


是的,這是安全的,但我們應該首先告誡 。 如果您在不同的平台之間傳遞問題,可能會遇到問題 ,然後您需要擔心字節排序/打包問題(可能還有許多其他問題 )。 這就是說,如果你不知道如何去做,那麼假設你可以按照你發送的順序可靠地接收到struct是不安全的。







udp