C使用sendto发送多种数据类型

时间:2009-11-21 22:28:22

标签: c arrays sockets char

在我的程序中,我有一些结构和一个char数组,我想通过UDP作为单个实体发送。

我正在努力想出一个很好的方法来做到这一点。

我的第一个想法是创建一个包含我想要发送的所有内容的结构但是使用sendto()

的类型错误

我如何将两个结构和一个char数组存储在另一个数组中,以便按照我的意图接收它?

由于

2 个答案:

答案 0 :(得分:5)

由于C允许你投射到你内心的内容,sendto()没有错误的类型。您只需将结构的地址强制转换为void *,并将其作为参数传递给sendto()

然而,很多人会对你留下深刻印象,不建议首先以这种方式发送结构:

  • 如果连接两侧的程序是由不同的编译器或不同的环境编译的,那么struct可能不会有相同的打包。

  • 如果转让中涉及的两个主机没有相同的内在性,则部分数据将以向后的方式结束。

  • 如果主机架构不同(例如32位与64位),那么结构的大小也可能会关闭。当然,如果基本数据类型(int,char,long,double等)的大小不同,则会出现大小差异。

所以......只有当你确定你的两个主人是同卵双胞胎或足够接近它时,请接受第一段的建议。

在其他情况下,请考虑将您的数据转换为某种中性文本表示形式,这可能是XML,但不需要是任何复杂的东西。字符串作为一个字节序列发送,并且可以出错的少得多。由于您可以控制格式,因此您应该能够在接收端轻松解析这些内容。

<强>更新

你提到你主要转移位字段。这意味着你的数据本质上由一堆整数组成,所有这些整数都小于(我假设)32位。

因此,我对“干净”解决方案的建议是编写一个函数来解压所有这些位字段,并将整个工作作为一个(可能是无符号的)整数数组运送。假设sizeof(int)在不同的机器上是相同的,htons()将成功地对这些数组的元素(每个单独!),然后您可以将它们包装回另一侧的结构。

答案 1 :(得分:0)

您可以使用writev将多个数据作为一个数据发送。只需创建它需要的struct iovec数组,为每个要发送的数据结构添加一个元素。