[问题] 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