我在 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 它是一个不可打印的字符
这似乎是一个基本问题。但是,我仍然找不到有关谷歌搜索或堆栈溢出的信息。感谢您的任何输入
根据 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