perl 中 recv() 函数的返回值

doo*_*oon 5 perl recv

我在 perl 中以这种方式创建了非阻塞 UDP 套接字

my $my_sock = IO::Socket::INET->new(LocalPort => $MY_PORT,
                                     Proto => 'udp',
                     Blocking => '0') or die "socket: $@";
Run Code Online (Sandbox Code Playgroud)

接收调用是

my $retValue = $sock->recv($my_message, 64);
Run Code Online (Sandbox Code Playgroud)

我需要知道 a) 当没有数据可供读取 b) 如果有数据,读取了多少数据 c) 任何错误条件

令人惊讶的是,我在 perldoc 中没有看到 recv 的任何返回值。当我自己尝试时,recv 在 (a) 中返回 undef,对于 b 它是一个不可打印的字符

这似乎是一个基本问题。但是,我仍然找不到有关谷歌搜索或堆栈溢出的信息。感谢您的任何输入

cyt*_*nus 4

根据 perldoc,recv“如果 SOCKET 协议支持,则返回发送者的地址;否则返回空字符串。如果出现错误,则返回未定义的值。”

如果您收到 undef,则意味着 recv 遇到错误。

您的代码中的错误位于以下行:

$retValue = $sock->recv($my_message, 64);
Run Code Online (Sandbox Code Playgroud)

recv 的函数原型为:

recv SOCKET,SCALAR,LENGTH,FLAGS 
Run Code Online (Sandbox Code Playgroud)

根据 perldoc,recv“尝试从指定的 SOCKET 文件句柄将数据的 LENGTH 个字符接收到变量 SCALAR 中。SCALAR 将增长或缩小到实际读取的长度。”

尝试:

$retvalue = recv($sock, $my_message, 64)
Run Code Online (Sandbox Code Playgroud)

这是我获取所有信息的地方: http://perldoc.perl.org/functions/recv.html

  • 您查看了书面文档。IO::Socket::INET 的文档可以在[这里](http://search.cpan.org/perldoc?IO::Socket::INET) 找到,它的父类是[这里](http:// search.cpan.org/perldoc?IO::Socket)。`$sock->recv($my_message, 64)` 实际上是正确的用法,尽管 `recv($sock, $my_message, 64)` 应该也能工作。 (2认同)