socket 可以传输结构体吗?

2023-06-13 09:48:24 +08:00
 sbldehanhan

例如: 结构体: struct test { int a; char b[1024]; float c; }; 数据: struct test data; 发送: send(sockfd, &data, sizeof(data), 0); 接收: recv(connfd, &data, sizeof(data), 0);

5223 次点击
所在节点    C
50 条回复
bthulu
2023-06-13 10:26:38 +08:00
传结构体不知道, 我一直在研究怎么通过 socket 传送小动物, 研究好了我就能做传送阵了.
coderxy
2023-06-13 10:26:41 +08:00
结构体是你这个语言的概念, 对于网络设备来说,都是二进制数据流。
kagetu
2023-06-13 10:29:55 +08:00
所以复杂的地方还不只在于你能不能发送结构,你还要和对方商量后怎么识别到底发的什么,要发送的数据有多大,比如你发了 8 个 00001111 ,由于网卡了一下,对方只接收到了前 4 个 0000 就以后全接完了。那他读取时肯定就不对了。
所以除了在首位加个区别发送数据类型的标志,你可能还需要再加个发送的数据大小的。具体根据你的实际情况去自定义就可以了,一般是把数据的大小放在首位。
Maboroshii
2023-06-13 10:30:30 +08:00
大小端和对齐要处理好
gps949
2023-06-13 10:30:39 +08:00
传啥不是传二进制啊,只要你说的“结构体”和二进制间 encode 、decode 规则确定了,啥都行。这里面 encode 、decode 就涉及序列化、字符编码这些了。
xqdoo00o
2023-06-13 10:32:56 +08:00
建议看下 Protobuf 或者 FlatBuffers
nuk
2023-06-13 10:35:01 +08:00
如果是同一个程序可以,不然不同的编译器,不同的编译 flag 都会造成差异
lincanbin
2023-06-13 10:40:11 +08:00
序列化就可以,json 或者 pb 或者其他
duke807
2023-06-13 10:43:42 +08:00
可以
为了扩展性,建议用 msgpack

或者 msgpack 的小端版本:
https://github.com/dukelec/msgpackel

不要用 json 和 protobuf
sbldehanhan
2023-06-13 10:50:51 +08:00
@coderxy 我可能没表达清除。我知道可以传,其实我是想知道这样传输会不会有什么问题?例如粘包、字节序和内存对齐什么的,我不太清楚在这里会不会造成影响。
sbldehanhan
2023-06-13 10:54:42 +08:00
@duke807 好的。
wildman9527
2023-06-13 11:15:47 +08:00
最简单的方法: 把 4 字节指针传过去就好了, 通过指针远程调用, 当然这样也有不好的地方就是: 判断野指针不方便, 因为这个指针太野了.
Monad
2023-06-13 11:27:43 +08:00
@duke807 为什么不要用 protobuf 呢~
JiRouWaZi
2023-06-13 11:28:20 +08:00
本质就是发二进制 ; 你可以直接发结构体的二进制 或者 发字符串这个二进制编码的一个高级格式

楼上说的大小端判断是因为 cpu 的一些特性,接受方的设备和发送方的特性不一致
huluye
2023-06-13 11:35:45 +08:00
最好还是要做一下序列化和反序列化。直接把结构体地址交给 socket 发送的话,结构体内部是否有引用到其他对象是需要考虑的,然后字节序也是个问题。
huluye
2023-06-13 11:38:21 +08:00
还有不同编译环境对结构体的字段对齐的处理也会有差异
fregie
2023-06-13 11:45:28 +08:00
tcp socket 传输的是字节流,就是一堆字节
你要自己把结构体编码成一堆字节用 socket 传给另一端,另一端再把这一堆字节解码成结构体
kenvix
2023-06-13 12:16:14 +08:00
最好是序列化,把内存数据直接传递除了要考虑楼上说的字节序、对齐,更大的问题是,如果链路不可信,数据被篡改后是要命的
mooyo
2023-06-13 12:20:42 +08:00
警惕粘包问题 socket 化
byaiu
2023-06-13 12:24:33 +08:00
粘包是有什么说法吗?
本来写网络程序就要处理流->用户可识别消息,不可避免会收到一半要等什么的。
这种处理为啥要含沙射影?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://tanronggui.xyz/t/948216

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX