Socket recv、sysread和Posix :: read在套接字中有什么区别?

4
我发现在Perl中至少有3种方法可以从非阻塞套接字读取数据。
$socket->recv
$socket->sysread
POSIX::read($socket,...

看起来是指同一件事的三个不同名称,我已经阅读了文档,但找不到任何巨大的区别。有人知道吗?

2个回答

8

sysread 是面向流 (TCP) 的(它不关心一个发送结束,另一个开始的位置),而recv 是面向数据报 (UDP) 的 (它确实关心)。

POSIX::read 适用于文件描述符,而sysread 适用于文件句柄。


更正:recv 在流中也可以很好地工作。它甚至可能比 sysread 更好。recv 只是针对套接字,而 sysread 适用于所有流(例如,它也适用于普通文件)。 - ikegami
参见:read 和 sysread 有什么区别?(请注意,这是关于内置的 readPOSIX::read 更接近于 sysread。) - ikegami

2
recv()的最佳文档来源是man recvfrom - 它基本上是对该系统调用的perl接口。请注意,recv()通常用于设置非连接导向(即UDP套接字)的套接字,但也可以用于连接导向(即TCP)套接字。 read()sysread()POSIX::read()之间的主要区别是:
  • read(...)使用文件句柄,IO被缓冲
  • sysread(...)使用文件句柄,IO未被缓冲
  • POSIX::read(...)使用文件描述符,IO未被缓冲
文件描述符是由POSIX::open()返回的值(一个小整数)。此外,您可以通过fileno()函数获取perl文件句柄的文件描述符。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接