5

我以这种方式在 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 它是一个不可打印的字符

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

4

2 回答 2

4

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

如果你得到一个 undef,这意味着 recv 遇到了一个错误。

您的代码中的错误在以下行中:

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

recv 的函数原型是:

recv SOCKET,SCALAR,LENGTH,FLAGS 

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

尝试:

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

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

于 2012-05-14T08:04:34.057 回答
2

返回的值recv是接收该数据的地址和端口

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

if ($retValue) {
  my ($port, $iaddr);
  ($port, $iaddr) = sockaddr_in($hispaddr);
  printf("address %s\n", inet_ntoa($iaddr));
  printf("port %s\n", $port);
  printf("name %s\n", gethostbyaddr($iaddr, AF_INET));
}

返回数据的长度可以通过以下方式确定

length($my_message);
于 2014-05-04T17:56:11.163 回答