首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当我使用非阻塞Perl套接字时,为什么不能获得所有数据呢?

当我使用非阻塞Perl套接字时,为什么不能获得所有数据呢?
EN

Stack Overflow用户
提问于 2009-10-13 04:55:57
回答 2查看 277关注 0票数 1

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

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

这是套接字的工作方式,还是它是一个bug?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-10-13 05:31:46

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

你不应该假设你能得到你想要的数据,也不能假设没有更多的数据可用。基本上,当连接打开时,更多的数据可以在任何时候到来。(read/recv/ end调用可能会返回一个特定值,表示“另一端关闭了连接”。)

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

  • 为每条消息添加一个长度前缀。读取器首先读取长度,然后继续读取数据,直到读取所需的数据为止。
  • 具有某种消息终止符/分隔符。这比较棘手,因为根据您正在做的事情,您可能需要意识到在阅读第一条消息时阅读下一条消息的可能性。它还意味着在“读取”代码中“理解”数据本身,而不仅仅是随意读取字节。然而,这确实意味着发送者不需要知道消息在开始发送之前有多长。

(另一种选择是对整个连接只有一条消息-即直到连接关闭为止。)

票数 6
EN

Stack Overflow用户

发布于 2009-10-13 05:05:08

阻塞意味着套接字在从接收函数返回之前等待,直到那里有数据。在返回之前,完全有可能会有一个微小的等待来尝试填充缓冲区,或者这可能只是一个时间问题。无论是否有多个包,非阻塞实现也完全有可能一次返回一个包。简而言之,不,这不是一个bug,但它的具体“为什么”是旧的借口“它的实现特定的”。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1558259

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档