作者clv (慢慢習慣成為大叔)
看板C_and_CPP
標題[問題] socket傳struct
時間Wed Dec 20 21:23:27 2017
開發平台(Platform):linux
Linux
編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出)
GCC
額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
Ssocket.h
問題(Question):
請問如何傳送struct
其實如果struct內容只是char x[24]固定長度的不會有問題
但因為宣告會有string或不固定大小長度的陣列
想請問有什麼簡單的方法嗎?
例如用idl發送之類的
不曉得該用什麼字眼去Google查詢相關資訊
感恩
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 180.177.162.146
※ 文章網址: https://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1513776209.A.CE7.html
1F:→ stupid0319: 你自己建立的struct的size會千變萬化? 12/20 21:40
3F:→ galic: 這個概念叫做data marshalling 12/20 21:54
4F:→ LiloHuang: 要自己刻就先傳4byte表資料長度,再把剩餘payload送出 12/20 22:19
5F:→ LiloHuang: 也可以在最前面再加上這個私有協定的版本號,用以擴充 12/20 22:20
6F:→ LiloHuang: 記得 network order 跟 host order 也得處理一下 12/20 22:24
7F:→ LiloHuang: 通常稱為 serialization,序列化物件又稱 marshalling 12/20 22:29
10F:→ galic: 應該還是叫做marshalling,serialization是指轉成特定格式 12/20 22:34
11F:→ galic: 像是把memory的資料轉成block形式寫到硬碟就是serialize 12/20 22:35
12F:→ galic: 從硬碟裡面讀出來 轉回記憶體格式讓指標可以操作是 12/20 22:36
13F:→ galic: deserialize 12/20 22:37
14F:→ LiloHuang: 建議你讀一下維基百科第一段,兩種說法都有類似的意思 12/20 22:37
15F:→ LiloHuang: 順便可以看一下 Google Protobuf 的簡介 12/20 22:38
16F:→ galic: 但是marshalling也包含如何deserialize資料 也就是Codebase 12/20 22:43
18F:→ galic: wiki說概念相似的引用資料你怎不看一下? 12/20 22:45
19F:→ galic: 微軟2004的文件只是說到marshalling需要serialize資料 12/20 22:45
20F:→ galic: wiki自己解釋成兩個概念相似 12/20 22:46
21F:→ LiloHuang: 因此我說如果是序列化物件比較適合用 marshalling XD 12/20 22:48
22F:→ LiloHuang: 但這篇文章的作者應該想要轉成 byte stream 12/20 22:48
23F:→ LiloHuang: 所以我會用 serialization 來稱呼這個行為 12/20 22:49
24F:→ LiloHuang: marshalling 相對於 serialization 就是多做了些事 12/20 22:51
25F:→ LiloHuang: 但若僅只用 BSD socket 傳資料未必得多做這麼多事情 12/20 22:52
27F:→ LiloHuang: 就像 TCP header 跟 payload 簡單能達成目的也不錯 12/20 22:54
28F:→ LiloHuang: 另外兩個說法類似是個人的經驗,並非指維基百科的內文 12/20 23:00
29F:→ LiloHuang: 比較嚴謹的定義就不重新描述一次了,如有誤解請多包涵 12/20 23:03
31F:→ LiloHuang: Writing a Message 的說明就是呼叫 Marshal 來做 12/20 23:22
32F:→ LiloHuang: serialize protocol buffer data 這之類的說明 12/20 23:24
33F:推 Killercat: 其實最簡單的做法就是boost::archive 12/21 22:48
34F:→ Killercat: 這個應該是能符合90%情況下最好的marshelling了 12/21 22:49
35F:→ Killercat: 缺點就是檔案很大 XD 12/21 22:49
36F:→ clv: 感謝唷 看看 12/22 19:29