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

C使用sendto发送多种数据类型,c,arrays,sockets,char,C,Arrays,Sockets,Char,在我的程序中,我有一些结构和一个字符数组,我想通过UDP将它们作为单个实体发送 我正在努力想一个好办法来做到这一点 我的第一个想法是创建一个包含我想要发送的所有内容的结构,但是使用sendto()时它的类型是错误的 如何将这两个结构和一个字符数组存储在另一个数组中,以便按照预期的方式接收它 谢谢因为C允许您随心所欲地进行转换,所以对于sendto()没有错误的类型。只需将结构的地址强制转换为void*,并将其作为参数传递给sendto() 然而,很多人会让你印象深刻,首先不建议以这种方式发送结构

在我的程序中,我有一些结构和一个字符数组,我想通过UDP将它们作为单个实体发送

我正在努力想一个好办法来做到这一点

我的第一个想法是创建一个包含我想要发送的所有内容的结构,但是使用sendto()时它的类型是错误的

如何将这两个结构和一个字符数组存储在另一个数组中,以便按照预期的方式接收它


谢谢

因为C允许您随心所欲地进行转换,所以对于
sendto()
没有错误的类型。只需将结构的地址强制转换为
void*
,并将其作为参数传递给
sendto()

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

  • 如果连接两侧的程序由不同的编译器或在不同的环境中编译,则您的
    struct
    s可能不会具有相同的打包

  • 如果传输中涉及的两台主机的端点不相同,则您的部分数据将返回

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

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

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

更新

您提到您正在传输大部分位字段。这意味着您的数据基本上由一组整数组成,它们都小于(我假设)32位


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

既然C允许您随心所欲地转换,那么
sendto()就没有错误的类型
。只需将结构的地址强制转换为
void*
,并将其作为参数传递给
sendto()

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

  • 如果连接两侧的程序由不同的编译器或在不同的环境中编译,则您的
    struct
    s可能不会具有相同的打包

  • 如果传输中涉及的两台主机的端点不相同,则您的部分数据将返回

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

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

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

更新

您提到您正在传输大部分位字段。这意味着您的数据基本上由一组整数组成,它们都小于(我假设)32位


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

您可以将多个数据作为一个数据块发送给另一个数组。只需创建所需的
struct iovec
数组,每个要发送的数据结构有一个元素。

您可以将多个数据作为一个元素一起发送。只需创建所需的
struct iovec
数组,每个要发送的数据结构对应一个元素。

感谢您的建议,我已经定义的结构纯粹包含位字段,当字段中的位超过1位时,我会对内容使用htons()。这会否定具有不同包装的结构,还是我仍然应该关注这一点?谢谢,
htons()。但是:我的回答中提出了更新建议,请稍候……那么,如果我要编写函数,结构中位的顺序会被保留吗?或者在数组的元素之间会有额外的位来填充一个int的32位。将16个1位字段打包成一个短的无符号int是保持位结构的好方法吗?我认为向左移动是解决这个问题的方法?好吧,正如你所猜测的,将所有的位字段转换成整数确实是浪费空间的,但这很简单。你担心你的带宽吗