2016-08-03 19 views
1

我在Perl中使用TCP protocol编写了示例client and server程序。 所以我用send()recv()函数。 因为我试图获得recv()函数的返回值。 示例代码,如何在perl中使用TCP协议检查recv()和send()的返回值?

my $return_value; 
$return_value = recv($client_socket, $data, 50, 0); 
print "return value is: $return_value\n"; 

当我执行我的代码,它不打印任何价值。 例如:

return value is: 

后,我读了下面的链接,即使我没有得到任何的回报价值。 return value of recv() function in perl

我该如何解决这个问题?

谢谢。

+0

http://perldoc.perl.org/functions/recv.html recv - 如果scket的协议支持,返回发送者地址 –

+0

'recv()'的返回值是一个二进制值,你必须传递给'Socket :: unpack_sockaddr_in()'获取IP地址和端口。我想它通常会打印成乱码,但它可能只是在您的情况下不包含任何可打印的字符。你可以尝试将你的输出输出到'xxd'来查看它们。这就是说,虽然它可能是工作'recv()'实际上并不是TCP服务器的首选功能。你可以使用'print()'和'<>'来进行基于行的通信,或者使用'read()'/'write()'来获得更好的东西。 – mbethke

回答

3

这可能是undef,表示发生了错误[1]

use Socket qw(unpack_sockaddr_in); 

defined($return_value) 
    or die("Can't recv: $!\n"); 

my ($peer_port, $peer_addr) = unpack_sockaddr_in($return_value); 

您已经知道您与之通信的对等方的地址和端口,所以这不是非常有用。这就提出了为什么你使用recv(而不是sysread)与TCP连接的流协议?你是否意识到你有时会少于你要求的50个字符?


  1. 始终使用use strict; use warnings 'all';!如果$return_value是undef,"return value is: $return_value\n"会发出警告。
+0

是的,我用'use strict'和'use warnings'。但它没有警告我,也没有打印任何价值 –