C使用sendto发送多种数据类型
在我的程序中,我有一些结构和一个字符数组,我想通过UDP将它们作为单个实体发送 我正在努力想一个好办法来做到这一点 我的第一个想法是创建一个包含我想要发送的所有内容的结构,但是使用sendto()时它的类型是错误的 如何将这两个结构和一个字符数组存储在另一个数组中,以便按照预期的方式接收它C使用sendto发送多种数据类型,c,arrays,sockets,char,C,Arrays,Sockets,Char,在我的程序中,我有一些结构和一个字符数组,我想通过UDP将它们作为单个实体发送 我正在努力想一个好办法来做到这一点 我的第一个想法是创建一个包含我想要发送的所有内容的结构,但是使用sendto()时它的类型是错误的 如何将这两个结构和一个字符数组存储在另一个数组中,以便按照预期的方式接收它 谢谢因为C允许您随心所欲地进行转换,所以对于sendto()没有错误的类型。只需将结构的地址强制转换为void*,并将其作为参数传递给sendto() 然而,很多人会让你印象深刻,首先不建议以这种方式发送结构
谢谢因为C允许您随心所欲地进行转换,所以对于
sendto()
没有错误的类型。只需将结构的地址强制转换为void*
,并将其作为参数传递给sendto()
然而,很多人会让你印象深刻,首先不建议以这种方式发送结构:
- 如果连接两侧的程序由不同的编译器或在不同的环境中编译,则您的
s可能不会具有相同的打包struct
- 如果传输中涉及的两台主机的端点不相同,则您的部分数据将返回
- 如果主机架构不同(例如,32位与64位),则结构的大小也可能不同。当然,如果基本数据类型(int、char、long、double等)的大小不同,则会出现大小差异
因此,我对“干净”解决方案的建议是,编写一个函数来解压所有这些位字段,并将整个工作作为一个整数数组(可能是无符号的)发送。假设
sizeof(int)
在所有机器上都是相同的,htons()
将成功地处理这些数组的元素(每个元素都是独立的!),然后您可以将它们包装回另一侧的结构中。既然C允许您随心所欲地转换,那么sendto()就没有错误的类型
。只需将结构的地址强制转换为void*
,并将其作为参数传递给sendto()
然而,很多人会让你印象深刻,首先不建议以这种方式发送结构:
- 如果连接两侧的程序由不同的编译器或在不同的环境中编译,则您的
s可能不会具有相同的打包struct
- 如果传输中涉及的两台主机的端点不相同,则您的部分数据将返回
- 如果主机架构不同(例如,32位与64位),则结构的大小也可能不同。当然,如果基本数据类型(int、char、long、double等)的大小不同,则会出现大小差异
因此,我对“干净”解决方案的建议是,编写一个函数来解压所有这些位字段,并将整个工作作为一个整数数组(可能是无符号的)发送。假设机器上的
sizeof(int)
是相同的,htons()
将在这些数组的元素(每个元素都是独立的!)上成功工作,然后您可以将它们包装回另一侧的结构中。您可以将多个数据作为一个数据块发送给另一个数组。只需创建所需的struct iovec
数组,每个要发送的数据结构有一个元素。您可以将多个数据作为一个元素一起发送。只需创建所需的struct iovec
数组,每个要发送的数据结构对应一个元素。感谢您的建议,我已经定义的结构纯粹包含位字段,当字段中的位超过1位时,我会对内容使用htons()。这会否定具有不同包装的结构,还是我仍然应该关注这一点?谢谢,htons()。但是:我的回答中提出了更新建议,请稍候……那么,如果我要编写函数,结构中位的顺序会被保留吗?或者在数组的元素之间会有额外的位来填充一个int的32位。将16个1位字段打包成一个短的无符号int是保持位结构的好方法吗?我认为向左移动是解决这个问题的方法?好吧,正如你所猜测的,将所有的位字段转换成整数确实是浪费空间的,但这很简单。你担心你的带宽吗