perl - perl中recv()函数的返回值

标签 perl recv

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

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

recv 调用是

my $retValue = $sock->recv($my_message, 64);

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

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

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

最佳答案

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

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

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

$retValue = $sock->recv($my_message, 64);

recv的函数原型(prototype)是:

recv SOCKET,SCALAR,LENGTH,FLAGS 

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

尝试:

$retvalue = recv($sock, $my_message, 64)

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

关于perl - perl中recv()函数的返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10579477/

相关文章:

perl - 如何以非 root 用户身份使用 CPAN?

c - 具有多个客户端的 tcp 服务器将消息发送回所有连接的客户端

c++ - 将超时设置为 recv 函数

python - Perl 相当于(Python-)列表理解

perl - 为应用程序设计错误消息系统的最具可扩展性/可扩展性的方法是什么?我将使用 Perl。

perl - 如何让 Dist::zilla 在 YAML 中指定最低 Perl 版本?

c - recv C 代码套接字中的奇怪数据

与 C 中的 recv() 混淆,是否存在底层输入缓冲区?数据来自哪里?

c - 处理坏文件描述符错误的方法

Perl 打包/解包和二进制字符串的长度