我发现在Perl中至少有3种方法可以从非阻塞套接字读取数据。
$socket->recv
$socket->sysread
POSIX::read($socket,...
看起来是指同一件事的三个不同名称,我已经阅读了文档,但找不到任何巨大的区别。有人知道吗?
$socket->recv
$socket->sysread
POSIX::read($socket,...
看起来是指同一件事的三个不同名称,我已经阅读了文档,但找不到任何巨大的区别。有人知道吗?
sysread
是面向流 (TCP) 的(它不关心一个发送结束,另一个开始的位置),而recv
是面向数据报 (UDP) 的 (它确实关心)。
POSIX::read
适用于文件描述符,而sysread
适用于文件句柄。
recv()
的最佳文档来源是man recvfrom
- 它基本上是对该系统调用的perl接口。请注意,recv()
通常用于设置非连接导向(即UDP套接字)的套接字,但也可以用于连接导向(即TCP)套接字。
read()
,sysread()
和POSIX::read()
之间的主要区别是:
read(...)
使用文件句柄,IO被缓冲sysread(...)
使用文件句柄,IO未被缓冲POSIX::read(...)
使用文件描述符,IO未被缓冲POSIX::open()
返回的值(一个小整数)。此外,您可以通过fileno()
函数获取perl文件句柄的文件描述符。
recv
在流中也可以很好地工作。它甚至可能比sysread
更好。recv
只是针对套接字,而sysread
适用于所有流(例如,它也适用于普通文件)。 - ikegamiread
。POSIX::read
更接近于sysread
。) - ikegami