2009-11-21 118 views
1

在我的程序中,我有几个结构和一个字符数组,我想通过UDP作为单个实体发送。C使用sendto发送多种数据类型

我正在努力想办法做到这一点。

我的第一个想法是创建一个包含一切,我想送一个结构,但它是错误的类型,使用的sendto()

如何将我的两个结构和字符数组存储在另一个数组这样它会以我想要的方式收到吗?

感谢

回答

5

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

然而,很多人都会对你留下深刻的印象,这是不可取的这种方式发送结构摆在首位:

  • 如果在连接两边的程序是由不同的编译编译器或在不同的环境中,很可能你的struct不会有相同的包装。

  • 如果参与传输的两台主机没有相同的余音,那么您的部分数据将最终倒退。

  • 如果主机体系结构不同(例如32位与64位),那么结构体的大小也可能会关闭。如果基本数据类型(int,char,long,double等)的大小不同,肯定会有大小差异。

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

在其他情况下,请考虑将您的数据转换为某种中性文本表示形式,这可能是XML,但不必是任何复杂的东西。字符串以字节序列的形式发送,而且出现的错误要少得多。既然你控制了格式,你应该能够在接收端稍微解决这些问题。

更新

你提到你所传递大多位字段。这意味着你的数据基本上由一堆整数组成,它们都小于(我假设的)32位。

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

+0

感谢您的建议,我已经定义的结构纯粹包含位字段,并且我在内容中使用htons()时,当字段中的位数多于1位时。这是否会否定具有不同包装的结构?还是应该关注这一点?谢谢 – Darrel 2009-11-21 23:17:48

+0

不,'htons()'解决了一个相关的问题,但不能帮你打包等。然而:在我的答案中提出了更新的建议,只需一分钟... – 2009-11-21 23:22:45

+0

因此,如果我要编写函数,结构中位的顺序是否会保留?或者在数组的元素之间会有额外的位来填充32位,我有一个int。将16个1位字段打包成一个简短的无符号整数是维持位结构的好方法吗?我认为左转会是这方面的路? – Darrel 2009-11-21 23:38:46

0

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