我正在尝试使用IO :: Socket模块通过TCP读取数据。我使用“recv
”函数或<TCP_SOCKET>
读取数据。随机地,我发现该程序挂起在我尝试通过TCP读取数据的特定行。除非我杀了它,否则程序不会继续或退出。为什么会发生这种情况或如何避免这种情况发生?
...谢谢
答案 0 :(得分:2)
您需要执行
选择
确定
之前是否有任何待处理的数据的recv
避免挂起的功能。你在谈论哪个平台?
查看select doc和IO::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);