Perl TCP读取不超时

时间:2011-03-03 09:26:15

标签: perl tcp

我正在尝试使用IO :: Socket模块通过TCP读取数据。我使用“recv”函数或<TCP_SOCKET>读取数据。随机地,我发现该程序挂起在我尝试通过TCP读取数据的特定行。除非我杀了它,否则程序不会继续或退出。为什么会发生这种情况或如何避免这种情况发生?

...谢谢

2 个答案:

答案 0 :(得分:2)

您需要执行

  

选择

确定

之前是否有任何待处理的数据
  

的recv

避免挂起的功能。你在谈论哪个平台?

查看select docIO::Socket doc
就其他文件而言,我建议使用Stein的“Perl网络编程”或经典的Stevens“Unix网络编程”。
实际上它基于使用echo / ping协议,因为并非所有物理网络问题都会触发异常(例如,只需在一台计算机上拔下网络电缆,远程计算机就看不到它)。

答案 1 :(得分:1)

我更喜欢使用IO::Socket::INET而且我遇到类似的超时问题。我用闹钟解决了它。

use IO::Socket::INET;
my $socket = IO::Socket::INET->new(  PeerAddr => $HOST,
    PeerPort => $PORT,
    Proto    => 'tcp',
    Timeout  => 20,    # It seems to be ignored.
);


eval {
       local $SIG{ALRM} = sub { die "TimedOut" };
       alarm 20; # 20 seconds global timeout for receiving.

       $res = <$socket>;

       # your code here. 

       # Disable timeout alarm after receiving.
       alarm 0;
    }

    if ($@) {
       if ($@  eq "TimedOut") {
          print "Warning: timeout receiving\n";
       }
       else {
          print "Error receiving.";
       }
    }
    close ($socket);