在c socket上接收整数数组的最佳方法

时间:2016-01-22 10:03:24

标签: c arrays sockets parsing

我需要在套接字上接收嵌套的整数数组,例如

[[1,2,3],[4,5,6],...]

子数组总是3个值,主数组的长度变化,但事先已知。

搜索谷歌给了我很多选择,从单独发送每个整数到只是将缓冲区转换为我认为它应该是什么(对我来说似乎有些不安全),所以我正在寻找一种安全快捷的方法这样做。

3 个答案:

答案 0 :(得分:1)

“子阵列”并不重要,最后你将发送3个 n 号码并让接收者将它们解释为 n 3行每个都有数字。

对于任何外部表示,您将不得不选择一个精度,即每个整数应该使用多少位。类型int32_t没有明确指定,因此可能选择32位并将每个数字视为var completionHandler : completionBlock = { _ in }

只要外部整数表示有多个字节,您就不得不担心这些字节的顺序。传统上使用网络字节排序(“大端”),但是现在许多系统都观察到大多数硬件是小端的,所以他们使用它。在这种情况下,您可以一次性将整个源数组写入套接字(假设您当然使用TCP / IP套接字),可能在行数或整数总数之前。

答案 1 :(得分:0)

假设带宽和数据大小不是非常关键,我建议,将阵列串行化为字符串是一种安全且独立于平台/体系结构的方式来传输这样的阵列。这具有以下优点:

  • 通信主机之间的整数二进制表示的大小不存在任何问题
  • 没有不同的字节序问题
  • 如果参数改变(子阵列的长度等),则更灵活
  • 与二进制协议相比,调试文本协议更容易

缺点是,必须通过通道传输更多字节,这是最好的二进制编码所必需的。

如果您想使用即用型库来序列化/反序列化数组,您可以查看许多可用的JSON库之一。 http://www.json.org/提供了一个包含多个实现的列表。

答案 2 :(得分:0)

按照您想要的方式对其进行序列化,这有两个主要可能性:

  1. 编码为字符串,并修复分隔符等。
  2. 用NBO编码,并发送数据来修复一些参数:首先是你的整数的长度,然后是数组的长度,然后是数据;一切都正确编码。
  3. 在C中,您可以使用XDR例程正确编码数据。