[問題] socket傳struct

作者: clv (慢慢習慣成為大叔)   2017-12-20 21:23:27
開發平台(Platform):linux
Linux
編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出)
GCC
額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
Ssocket.h
問題(Question):
請問如何傳送struct
其實如果struct內容只是char x[24]固定長度的不會有問題
但因為宣告會有string或不固定大小長度的陣列
想請問有什麼簡單的方法嗎?
例如用idl發送之類的
不曉得該用什麼字眼去Google查詢相關資訊
感恩
作者: stupid0319 (徵女友)   2017-12-20 21:40:00
你自己建立的struct的size會千變萬化?
作者: galic (嘎利)   2017-12-20 21:53:00
介紹你神器 https://lcm-proj.github.io/這個概念叫做data marshalling
作者: LiloHuang (十年一刻)   2017-12-20 22:19:00
要自己刻就先傳4byte表資料長度,再把剩餘payload送出也可以在最前面再加上這個私有協定的版本號,用以擴充記得 network order 跟 host order 也得處理一下通常稱為 serialization,序列化物件又稱 marshalling簡單地幫你找了個範例可以參考 https://goo.gl/VQ2dFc延伸閱讀維基百科 https://goo.gl/kQrPT2
作者: galic (嘎利)   2017-12-20 22:34:00
應該還是叫做marshalling,serialization是指轉成特定格式像是把memory的資料轉成block形式寫到硬碟就是serialize從硬碟裡面讀出來 轉回記憶體格式讓指標可以操作是deserialize
作者: LiloHuang (十年一刻)   2017-12-20 22:37:00
建議你讀一下維基百科第一段,兩種說法都有類似的意思順便可以看一下 Google Protobuf 的簡介
作者: galic (嘎利)   2017-12-20 22:43:00
但是marshalling也包含如何deserialize資料 也就是Codebasehttps://stackoverflow.com/questions/770474/ 請參考wiki說概念相似的引用資料你怎不看一下?微軟2004的文件只是說到marshalling需要serialize資料wiki自己解釋成兩個概念相似
作者: LiloHuang (十年一刻)   2017-12-20 22:48:00
因此我說如果是序列化物件比較適合用 marshalling XD但這篇文章的作者應該想要轉成 byte stream所以我會用 serialization 來稱呼這個行為marshalling 相對於 serialization 就是多做了些事但若僅只用 BSD socket 傳資料未必得多做這麼多事情
作者: galic (嘎利)   2017-12-20 22:54:00
若是這種需求就用 http://cr.yp.to/proto/netstrings.txt
作者: LiloHuang (十年一刻)   2017-12-20 22:54:00
就像 TCP header 跟 payload 簡單能達成目的也不錯另外兩個說法類似是個人的經驗,並非指維基百科的內文比較嚴謹的定義就不重新描述一次了,如有誤解請多包涵像 Google Protobuf 文件 https://goo.gl/cDfqcSWriting a Message 的說明就是呼叫 Marshal 來做serialize protocol buffer data 這之類的說明
作者: Killercat (殺人貓™)   2017-12-21 22:48:00
其實最簡單的做法就是boost::archive這個應該是能符合90%情況下最好的marshelling了缺點就是檔案很大 XD
作者: clv (慢慢習慣成為大叔)   2017-12-22 19:29:00
感謝唷 看看

Links booklink

Contact Us: admin [ a t ] ucptt.com