【问题标题】:C sending multiple data types using sendtoC使用sendto发送多种数据类型
【发布时间】:2009-11-21 22:28:22
【问题描述】:

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

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

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

如何将这两个结构和一个 char 数组存储在另一个数组中,以便以我想要的方式接收它?

谢谢

【问题讨论】:

    标签: c arrays sockets char


    【解决方案1】:

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

    然而,很多人会给你留下深刻印象,首先以这种方式发送结构是不可取的:

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

    • 如果参与传输的两台主机不具有相同的字节序,您的部分数据最终会倒退。

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

    所以...请仅在您确定您的两个主人是同卵双胞胎或足够接近时才接受第一段的建议。

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

    更新

    您提到您传输的主要是位字段。这意味着您的数据基本上由一堆整数组成,所有整数都小于(我假设)32 位。

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

    【讨论】:

    • 感谢您的建议,我已经定义的结构完全包含位字段,并且当字段中有超过 1 位时,我在内容上使用 htons()。这会否定具有不同包装的结构还是我仍然应该担心这个?谢谢
    • 不,htons() 解决了相关问题,但无法帮助您打包等。但是:我的回答中提出了更新的建议,请稍等...
    • 那么如果我要编写函数,结构中位的顺序会被保留吗?或者数组元素之间是否会有额外的位来填充我对 int 的 32 位。将 16 个 1 位字段打包成一个短的 unsigned int 是维护位结构的好方法吗?我认为向左移动是解决这个问题的方法?
    • 嗯,将所有位字段转换为整数确实像您猜想的那样浪费空间,但这很简单。您是否担心您将使用的带宽量?如果是这样,可能需要进行一些位旋转。不过,我会懒得去解决所有这些麻烦。
    • 我要离开几个小时。如果您想进一步追求这一点,其他人将不得不帮助您,对不起。也许您想发布另一个更关注细节的问题?
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多