Perl 套接字recv、sysread和Posix::read-in套接字之间的区别?

Perl 套接字recv、sysread和Posix::read-in套接字之间的区别?,perl,Perl,我在perl中找到了至少3种读取非阻塞套接字的方法 $socket->recv $socket->sysread POSIX::read($socket,... 看起来有三个不同的名字是同一件事,我读了文件,但我找不到一个巨大的不同。有人吗?sysread是面向流(TCP)的(它不关心一个发送的结束和另一个发送的开始),而recv是面向数据报(UDP)的(它关心) POSIX::read用于文件描述符,而sysread用于文件句柄。有关recv()的最佳文档来源是man recvf

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

$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
适用于所有流(例如,它也适用于普通文件)。另请参见:(注意,这是关于内置的
read
POSIX::read
更接近
sysread