[問題] socket傳struct

看板C_and_CPP作者 (慢慢習慣成為大叔)時間6年前 (2017/12/20 21:23), 編輯推噓1(1035)
留言36則, 5人參與, 6年前最新討論串1/1
開發平台(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

12/20 21:40, 6年前 , 1F
你自己建立的struct的size會千變萬化?
12/20 21:40, 1F

12/20 21:53, 6年前 , 2F
12/20 21:53, 2F

12/20 21:54, 6年前 , 3F
這個概念叫做data marshalling
12/20 21:54, 3F

12/20 22:19, 6年前 , 4F
要自己刻就先傳4byte表資料長度,再把剩餘payload送出
12/20 22:19, 4F

12/20 22:20, 6年前 , 5F
也可以在最前面再加上這個私有協定的版本號,用以擴充
12/20 22:20, 5F

12/20 22:24, 6年前 , 6F
記得 network order 跟 host order 也得處理一下
12/20 22:24, 6F

12/20 22:29, 6年前 , 7F
通常稱為 serialization,序列化物件又稱 marshalling
12/20 22:29, 7F

12/20 22:31, 6年前 , 8F
簡單地幫你找了個範例可以參考 https://goo.gl/VQ2dFc
12/20 22:31, 8F

12/20 22:31, 6年前 , 9F
延伸閱讀維基百科 https://goo.gl/kQrPT2
12/20 22:31, 9F

12/20 22:34, 6年前 , 10F
應該還是叫做marshalling,serialization是指轉成特定格式
12/20 22:34, 10F

12/20 22:35, 6年前 , 11F
像是把memory的資料轉成block形式寫到硬碟就是serialize
12/20 22:35, 11F

12/20 22:36, 6年前 , 12F
從硬碟裡面讀出來 轉回記憶體格式讓指標可以操作是
12/20 22:36, 12F

12/20 22:37, 6年前 , 13F
deserialize
12/20 22:37, 13F

12/20 22:37, 6年前 , 14F
建議你讀一下維基百科第一段,兩種說法都有類似的意思
12/20 22:37, 14F

12/20 22:38, 6年前 , 15F
順便可以看一下 Google Protobuf 的簡介
12/20 22:38, 15F

12/20 22:43, 6年前 , 16F
但是marshalling也包含如何deserialize資料 也就是Codebase
12/20 22:43, 16F

12/20 22:44, 6年前 , 17F

12/20 22:45, 6年前 , 18F
wiki說概念相似的引用資料你怎不看一下?
12/20 22:45, 18F

12/20 22:45, 6年前 , 19F
微軟2004的文件只是說到marshalling需要serialize資料
12/20 22:45, 19F

12/20 22:46, 6年前 , 20F
wiki自己解釋成兩個概念相似
12/20 22:46, 20F

12/20 22:48, 6年前 , 21F
因此我說如果是序列化物件比較適合用 marshalling XD
12/20 22:48, 21F

12/20 22:48, 6年前 , 22F
但這篇文章的作者應該想要轉成 byte stream
12/20 22:48, 22F

12/20 22:49, 6年前 , 23F
所以我會用 serialization 來稱呼這個行為
12/20 22:49, 23F

12/20 22:51, 6年前 , 24F
marshalling 相對於 serialization 就是多做了些事
12/20 22:51, 24F

12/20 22:52, 6年前 , 25F
但若僅只用 BSD socket 傳資料未必得多做這麼多事情
12/20 22:52, 25F

12/20 22:54, 6年前 , 26F
若是這種需求就用 http://cr.yp.to/proto/netstrings.txt
12/20 22:54, 26F

12/20 22:54, 6年前 , 27F
就像 TCP header 跟 payload 簡單能達成目的也不錯
12/20 22:54, 27F

12/20 23:00, 6年前 , 28F
另外兩個說法類似是個人的經驗,並非指維基百科的內文
12/20 23:00, 28F

12/20 23:03, 6年前 , 29F
比較嚴謹的定義就不重新描述一次了,如有誤解請多包涵
12/20 23:03, 29F

12/20 23:22, 6年前 , 30F
像 Google Protobuf 文件 https://goo.gl/cDfqcS
12/20 23:22, 30F

12/20 23:22, 6年前 , 31F
Writing a Message 的說明就是呼叫 Marshal 來做
12/20 23:22, 31F

12/20 23:24, 6年前 , 32F
serialize protocol buffer data 這之類的說明
12/20 23:24, 32F

12/21 22:48, 6年前 , 33F
其實最簡單的做法就是boost::archive
12/21 22:48, 33F

12/21 22:49, 6年前 , 34F
這個應該是能符合90%情況下最好的marshelling了
12/21 22:49, 34F

12/21 22:49, 6年前 , 35F
缺點就是檔案很大 XD
12/21 22:49, 35F

12/22 19:29, 6年前 , 36F
感謝唷 看看
12/22 19:29, 36F
文章代碼(AID): #1QEcHHpd (C_and_CPP)