【发布时间】:2012-11-25 02:38:00
【问题描述】:
我在 perl 中找到了至少 3 种从非阻塞套接字读取的方法
$socket->recv
$socket->sysread
POSIX::read($socket,...
看起来同一事物有 3 个不同的名称,我阅读了文档,但找不到一个巨大的不同之处。有人吗?
【问题讨论】:
标签: perl
我在 perl 中找到了至少 3 种从非阻塞套接字读取的方法
$socket->recv
$socket->sysread
POSIX::read($socket,...
看起来同一事物有 3 个不同的名称,我阅读了文档,但找不到一个巨大的不同之处。有人吗?
【问题讨论】:
标签: perl
sysread 是面向流 (TCP) 的(它不关心一个发送结束和另一个开始的位置),recv 是面向数据报 (UDP) 的(它确实关心)。
POSIX::read 作用于文件描述符,而sysread 作用于文件句柄。
【讨论】:
recv 实际上也适用于流。它甚至可能是比sysread 更好的选择。 recv 只是特定于套接字,而 sysread 适用于所有流(例如,它也适用于普通文件)。
read and sysread?(注意这是关于内置的read。POSIX::read更接近sysread。)
recv() 的最佳文档来源是man recvfrom - 它基本上是该系统调用的 perl 接口。请注意,recv() 通常用于设置为非面向连接(即 UDP 套接字)的套接字,但它也可用于面向连接(即 TCP)的套接字。
read()、sysread() 和 POSIX::read() 之间的区别是:
read(...) 获取文件句柄,并缓冲 IOsysread(...) 获取文件句柄,IO 没有缓冲POSIX::read(...) 接受一个文件描述符并且 IO 没有被缓冲文件描述符是一个由POSIX::open() 返回的值(一个小整数)。
另外,您可以通过fileno() 函数获取perl 文件句柄的文件描述符。
【讨论】: