【问题标题】:Send Data packages over UDP通过 UDP 发送数据包
【发布时间】:2012-02-24 13:37:37
【问题描述】:

我正在尝试通过套接字发送一个标量值,这是我使用 nfreeze 从可存储中获得的。 一步一步:

  1. 我得到了标量 $serializedHash = nfreeze \%hash;
  2. 我想通过套接字发送它$sendSocket->send($serializedHash);

只要标量 $serializedHash 不大于 1024 字节,就可以正常工作。因为我在另一边有一个只能接收最大数据的套接字。长度为 1024 字节。 我也不能将$serializedHash 存储在一个文件中,然后用sysreadsyswrite 处理它。

我不希望每个套接字发送每一行,因为我的 Hash 有超过 200 万个条目。哈希元素由 \n 分隔,因此我尝试使用 split 函数,但随后我得到了一个包含 200 万个条目的数组。

如何通过 UDP 套接字以包的形式发送数据?

【问题讨论】:

  • 为什么是 UDP?实在是不胜任。 (有关详细信息,请参阅我对 raina77ow 答案的评论。)

标签: perl sockets udp send storable


【解决方案1】:

您可以按块处理您的序列化哈希,如下所示:

while ($serializedHash =~ /(.{1,1024})/sg) {
  my $chunk = $1;
  # sending $chunk
}

【讨论】:

  • 请多解释一下 =)
  • 据我了解,您需要将大字符串拆分为较小的部分,然后通过 UDP 将它们一一发送。我建议的实际上是一个非常普通的解决方案:while ($string =~ /$pattern/g) 循环。 $pattern 一次又一次地在字符串上匹配,每次都从它之前完成的位置开始。由于默认情况下它是贪婪的,因此它会捕获 1024 个符号 - 或剩余的任何符号。
  • 顺便说一句,这里有一个潜在的错误:因为我们应该处理字节,而不是字符,也许应该引入“使用字节”指令。
  • 这远不是一个完整的解决方案。与此不同的是,UDP 不保证接收到的数据包会按照发送的顺序到达,因此您必须对数据块进行编号。而且您必须协调块的数量,以便它知道何时停止收听。等等。换句话说,您必须(有效地)通过 UDP 重新实现 TCP。
  • @raina77ow,不,永远不要使用use bytes。字符串的字符是字节,因此将字符串拆分为 1024 个字符的块与将字符串拆分为 1024 个字节的块是一样的。它确实需要一个 /s(添加)以避免错误处理字节 0A。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-06
相关资源
最近更新 更多