【发布时间】:2009-11-21 22:28:22
【问题描述】:
在我的程序中,我有一些结构和一个 char 数组,我想通过 UDP 将它们作为单个实体发送。
我正在努力想一个好的方法来做到这一点。
我的第一个想法是创建一个结构,其中包含我想要发送的所有内容,但使用 sendto() 的类型错误
如何将这两个结构和一个 char 数组存储在另一个数组中,以便以我想要的方式接收它?
谢谢
【问题讨论】:
在我的程序中,我有一些结构和一个 char 数组,我想通过 UDP 将它们作为单个实体发送。
我正在努力想一个好的方法来做到这一点。
我的第一个想法是创建一个结构,其中包含我想要发送的所有内容,但使用 sendto() 的类型错误
如何将这两个结构和一个 char 数组存储在另一个数组中,以便以我想要的方式接收它?
谢谢
【问题讨论】:
由于 C 允许您随心所欲地转换,因此 sendto() 没有错误类型。您只需将结构的地址转换为 void * 并将其作为参数传递给 sendto()。
然而,很多人会给你留下深刻印象,首先以这种方式发送结构是不可取的:
如果连接两侧的程序由不同的编译器或在不同的环境中编译,您的structs 很可能不会有相同的包装。
如果参与传输的两台主机不具有相同的字节序,您的部分数据最终会倒退。
如果主机架构不同(例如 32 位与 64 位),则结构的大小也可能会关闭。如果您的基本数据类型(int、char、long、double 等)的大小不同,肯定会有大小差异。
所以...请仅在您确定您的两个主人是同卵双胞胎或足够接近时才接受第一段的建议。
在其他情况下,请考虑将您的数据转换为某种中性文本表示形式,它可以是 XML,但不需要那么复杂。字符串作为字节序列发送,出错的可能性要小得多。由于您控制格式,您应该能够在接收端轻松解析这些内容。
更新
您提到您传输的主要是位字段。这意味着您的数据基本上由一堆整数组成,所有整数都小于(我假设)32 位。
因此,我对“干净”解决方案的建议是编写一个函数来解压缩所有这些位字段,并将整个作品作为一个(可能是无符号的)整数数组发送。假设 sizeof(int) 在机器上是相同的,htons() 将成功地处理这些数组的元素(每个元素!),然后您可以将它们包装回另一侧的结构中。
【讨论】:
htons() 解决了相关问题,但无法帮助您打包等。但是:我的回答中提出了更新的建议,请稍等...
您可以使用writev 将多条数据作为一个发送。只需创建它需要的 struct iovec 数组,每个要发送的数据结构都有一个元素。
【讨论】: