看板 C_and_CPP 關於我們 聯絡資訊
開發平台(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://www.ptt.cc/bbs/C_and_CPP/M.1513776209.A.CE7.html
stupid0319: 你自己建立的struct的size會千變萬化? 12/20 21:40
galic: 介紹你神器 https://lcm-proj.github.io/ 12/20 21:53
galic: 這個概念叫做data marshalling 12/20 21:54
LiloHuang: 要自己刻就先傳4byte表資料長度,再把剩餘payload送出 12/20 22:19
LiloHuang: 也可以在最前面再加上這個私有協定的版本號,用以擴充 12/20 22:20
LiloHuang: 記得 network order 跟 host order 也得處理一下 12/20 22:24
LiloHuang: 通常稱為 serialization,序列化物件又稱 marshalling 12/20 22:29
LiloHuang: 簡單地幫你找了個範例可以參考 https://goo.gl/VQ2dFc 12/20 22:31
LiloHuang: 延伸閱讀維基百科 https://goo.gl/kQrPT2 12/20 22:31
galic: 應該還是叫做marshalling,serialization是指轉成特定格式 12/20 22:34
galic: 像是把memory的資料轉成block形式寫到硬碟就是serialize 12/20 22:35
galic: 從硬碟裡面讀出來 轉回記憶體格式讓指標可以操作是 12/20 22:36
galic: deserialize 12/20 22:37
LiloHuang: 建議你讀一下維基百科第一段,兩種說法都有類似的意思 12/20 22:37
LiloHuang: 順便可以看一下 Google Protobuf 的簡介 12/20 22:38
galic: 但是marshalling也包含如何deserialize資料 也就是Codebase 12/20 22:43
galic: https://stackoverflow.com/questions/770474/ 請參考 12/20 22:44
galic: wiki說概念相似的引用資料你怎不看一下? 12/20 22:45
galic: 微軟2004的文件只是說到marshalling需要serialize資料 12/20 22:45
galic: wiki自己解釋成兩個概念相似 12/20 22:46
LiloHuang: 因此我說如果是序列化物件比較適合用 marshalling XD 12/20 22:48
LiloHuang: 但這篇文章的作者應該想要轉成 byte stream 12/20 22:48
LiloHuang: 所以我會用 serialization 來稱呼這個行為 12/20 22:49
LiloHuang: marshalling 相對於 serialization 就是多做了些事 12/20 22:51
LiloHuang: 但若僅只用 BSD socket 傳資料未必得多做這麼多事情 12/20 22:52
galic: 若是這種需求就用 http://cr.yp.to/proto/netstrings.txt 12/20 22:54
LiloHuang: 就像 TCP header 跟 payload 簡單能達成目的也不錯 12/20 22:54
LiloHuang: 另外兩個說法類似是個人的經驗,並非指維基百科的內文 12/20 23:00
LiloHuang: 比較嚴謹的定義就不重新描述一次了,如有誤解請多包涵 12/20 23:03
LiloHuang: 像 Google Protobuf 文件 https://goo.gl/cDfqcS 12/20 23:22
LiloHuang: Writing a Message 的說明就是呼叫 Marshal 來做 12/20 23:22
LiloHuang: serialize protocol buffer data 這之類的說明 12/20 23:24
Killercat: 其實最簡單的做法就是boost::archive 12/21 22:48
Killercat: 這個應該是能符合90%情況下最好的marshelling了 12/21 22:49
Killercat: 缺點就是檔案很大 XD 12/21 22:49
clv: 感謝唷 看看 12/22 19:29