Performance 简单的Perl套接字脚本挂起

Performance 简单的Perl套接字脚本挂起,performance,perl,sockets,tcp,Performance,Perl,Sockets,Tcp,我有一个Perl脚本,包含以下内容: #!/usr/bin/perl # Script name: socket.pl # Build socket: use IO::Socket; my $sock = new IO::Socket::INET ( PeerAddr => '74.74.74.74', PeerPort => '1543

我有一个Perl脚本,包含以下内容:

 #!/usr/bin/perl
 # Script name: socket.pl

 # Build socket:
 use IO::Socket;
 my $sock = new IO::Socket::INET (
                                  PeerAddr => '74.74.74.74',
                                  PeerPort => '1543',
                                  Proto => 'tcp',
                                 )
 or die "Could not create socket: $@\n"; 

 # Make a pipe-delimited string out of the four arguments:
 $data = "$ARGV[0]$ARGV[1]|$ARGV[2]|$ARGV[3]|$ARGV[4]";

 # Write to socket and immediately close:
 print $sock "$data";
 close($sock);
当脚本被多次调用时,问题开始显现。在脚本每分钟被调用60次的场景中,如果我对
socket.pl
调用
pgrep
,我会看到100或200个实例已经“运行”了3或4分钟。他们正在写入的服务器似乎立即在无异常套接字上接收
$data

既然我在对等机上没有看到任何表面上的错误,为什么即使这个脚本似乎已写入套接字,它仍会在周围徘徊?解释器是否会陷入困境或遇到一些约束或限制(脚本运行在一个功能非常强大的机器上,因此它不是系统限制)


谢谢。

不确定这是否有用,但您可以尝试使用
IO::socket::INET
本身关闭套接字:
$sock->close()
$sock->shutdown(2)
。另外,请尝试在末尾添加退出(0)。

这看起来没问题,一目了然。我猜您在另一端(服务器)上遇到了问题。对等方通过无异常套接字正确接收消息,并从对等方日志(软件/日志/源代码已打开)确认。然后,对等方从其末端关闭套接字……但我的perl脚本只是挂起,即使它也(应该)正在关闭套接字。是的,这真的很奇怪。如果你指定一个超时怎么办?您是否记录了socket.pl的STDERR输出?如果它阻塞,假设参数很小,我打赌它在
new
中。我肯定知道它在
new
中没有阻塞,因为我可以验证它的套接字操作是否完成(通过查看它连接到的框的日志)。socket操作完成后,我认为
close($sock)
可能是缺陷所在。当我进行更新时,我会在这篇文章中指出这是否有效。谢谢。我把这些放进去重新测试一下。出于好奇,为什么
close($sock)
不够好?不仅
close($sock)
不够好,而且不需要它。Perl将在退出之前自动执行此操作,如果Perl不执行此操作,系统将执行此操作(例如,在SEGFAULT事件中)。Perl是否会在脚本结束时隐式关闭它?也就是说,如果TCP对等方没有关闭它或试图写入它怎么办?