【问题标题】:Difference between Socket recv, sysread and Posix::read in sockets?套接字中的 Socket recv、sysread 和 Posix::read 之间的区别?
【发布时间】:2012-11-25 02:38:00
【问题描述】:

我在 perl 中找到了至少 3 种从非阻塞套接字读取的方法

$socket->recv
$socket->sysread
POSIX::read($socket,...

看起来同一事物有 3 个不同的名称,我阅读了文档,但找不到一个巨大的不同之处。有人吗?

【问题讨论】:

    标签: perl


    【解决方案1】:

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

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

    【讨论】:

    • 更正:recv 实际上也适用于流。它甚至可能是比sysread 更好的选择。 recv 只是特定于套接字,而 sysread 适用于所有流(例如,它也适用于普通文件)。
    • 另见:What is the difference between read and sysread?(注意这是关于内置的readPOSIX::read更接近sysread。)
    【解决方案2】:

    recv() 的最佳文档来源是man recvfrom - 它基本上是该系统调用的 perl 接口。请注意,recv() 通常用于设置为非面向连接(即 UDP 套接字)的套接字,但它也可用于面向连接(即 TCP)的套接字。

    read()sysread()POSIX::read() 之间的区别是:

    • read(...) 获取文件句柄,并缓冲 IO
    • sysread(...) 获取文件句柄,IO 没有缓冲
    • POSIX::read(...) 接受一个文件描述符并且 IO 没有被缓冲

    文件描述符是一个由POSIX::open() 返回的值(一个小整数)。 另外,您可以通过fileno() 函数获取perl 文件句柄的文件描述符。

    【讨论】:

      猜你喜欢
      • 2016-07-18
      • 2010-12-19
      • 2010-12-28
      • 2016-08-15
      • 2020-10-18
      • 1970-01-01
      • 2020-10-10
      • 1970-01-01
      相关资源
      最近更新 更多