gpt4 book ai didi

perl - 为什么我在使用非阻塞 Perl 套接字时无法获取所有数据?

转载 作者:行者123 更新时间:2023-12-03 11:56:28 26 4
gpt4 key购买 nike

我在 AIX 5.3 中使用 Perl 套接字,Perl 版本 5.8.2

我有一个用 Perl 套接字编写的服务器。有一个选项叫做“Blocking”,可以设置为0或1。当我使用Blocking => 0时并运行服务器和客户端发送数据(5000 字节),我一次只能收到 2902 字节。当我使用 Blocking => 1 ,我能够在一次通话中接收所有字节。

这是套接字的工作方式还是错误?

最佳答案

这是套接字的基本部分——或者更确切地说,TCP ,这是面向流的。 ( UDP 是面向数据包的。)

你永远不应该假设你会得到你要求的尽可能多的数据,或者没有更多的可用数据。基本上,在连接打开时,随时可能会出现更多数据。 (read/recv/whatever 调用可能会返回一个特定值,表示“另一端关闭了连接。)

这意味着您必须设计协议(protocol)来处理此问题 - 如果您有效地尝试将离散消息从 A 传递到 B,则两种常见的方法是:

  • 在每条消息前面加上一个长度。读取器首先读取长度,然后继续读取数据,直到读取到所需的长度。
  • 有某种消息终止符/分隔符。这比较棘手,因为根据您正在执行的操作,您可能需要注意在阅读第一条消息时阅读下一条消息开头的可能性。这也意味着在“读取”代码中“理解”数据本身,而不仅仅是任意读取字节。但是,这确实意味着发送者在开始发送之前不需要知道消息的长度。

  • (另一种选择是整个连接只有一条消息 - 即您阅读直到连接关闭。)

    关于perl - 为什么我在使用非阻塞 Perl 套接字时无法获取所有数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1558259/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com