我在AIX 5.3中使用Perl套接字,Perl版本5.8.2
我有一个用Perl套接字编写的服务器。有一个名为“阻塞”的选项,可以设置为0或1。当我使用Blocking => 0运行服务器和客户端发送数据(5000字节)时,我一次调用只能接收2902字节。当我使用Blocking => 1时,我能够在一次调用中接收所有字节。
这是套接字的工作方式,还是它是一个bug?
发布于 2009-10-13 05:31:46
这是套接字的基本部分--或者更确切地说,是TCP,它是面向流的。(UDP是面向数据包的。)
你不应该假设你能得到你想要的数据,也不能假设没有更多的数据可用。基本上,当连接打开时,更多的数据可以在任何时候到来。(read/recv/ end调用可能会返回一个特定值,表示“另一端关闭了连接”。)
这意味着您必须设计您的协议来处理此问题-如果您正在有效地尝试将离散消息从A传递到B,则有两种常见的方法来完成此操作:
(另一种选择是对整个连接只有一条消息-即直到连接关闭为止。)
发布于 2009-10-13 05:05:08
阻塞意味着套接字在从接收函数返回之前等待,直到那里有数据。在返回之前,完全有可能会有一个微小的等待来尝试填充缓冲区,或者这可能只是一个时间问题。无论是否有多个包,非阻塞实现也完全有可能一次返回一个包。简而言之,不,这不是一个bug,但它的具体“为什么”是旧的借口“它的实现特定的”。
https://stackoverflow.com/questions/1558259
复制相似问题