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

时间:2012-05-14 08:01:18

标签: 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是一个不可打印的字符

这似乎是一个基本问题。但是,我仍然无法在google搜索或堆栈溢出时找到相关信息。谢谢任何输入

2 个答案:

答案 0 :(得分:3)

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

如果你得到一个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

答案 1 :(得分: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);