4

我正在编写一个小脚本来监视是否尝试使用 Perl 5.10.1 在我的 Linux 机器(Centos 6)上访问某些端口。我正在为我的 peerhost 请求取回空白条目。我不确定为什么。听起来这可能是 IO 套接字模块(http://snowhare.com/utilities/perldoc2tree/example/IO/Socket.html)中的故障,但我不太确定。任何见解将不胜感激。

编辑:

由于我启用了严格和警告,在我认为它是空白的情况下,我得到了一个“未初始化的值 $display”。

#! /usr/bin/perl
use strict;
use warnings;

use IO::Socket;
use Sys::Syslog qw( :DEFAULT setlogsock);
use threads;

my @threads=();
my @ports=(88,110,389);

main(\@ports);

sub main
{
    my $ports=shift;
    setlogsock('unix');
    openlog($0,'','user');
    for my $port (@{$ports} ) {
        push @threads, threads->create(\&create_monitor, $port );
    }
    $_->join foreach @threads;
    closelog;
# wait for all threads to finish
}


sub create_monitor{
    my $LocalPort=shift;

    my $sock = new IO::Socket::INET (
        LocalPort => $LocalPort,
        Proto => 'tcp',
        Listen => 1,
        Reuse => 1,
        ) or die "Could not create socket: $!\n";


    while(1)
    {
        my $peer_connection= $sock->accept;
        my $display = $peer_connection->peerhost();
        my $message="Connection attempt on port $LocalPort from $display";
        #syslog('info', $message);
        print $message."\n";
    }

}

注意 - 这个脚本永远不会完成是故意的。我最终会用一个初始化脚本来包装它,让它作为服务运行。

4

1 回答 1

1

Perlaccept()与大多数其他函数一样有一个错误代码。因为accept()这是一个错误的回报,请参见此处

因此,当您得到未定义的结果时,调用中会出现错误accept()。accept 的错误保存在 errno 变量($!)中。

peerhost()(见这里)也是如此。它也可能失败并返回错误代码。

accept()如果您只使用上面的代码而没有其他任何东西,那么您可能会在失败时达到系统的连接限制(您应该关闭连接) 。请参阅rlimit()以了解如何增加该数字。

失败的一种情况peerhost()可能是远程连接已经关闭。

于 2013-01-03T23:17:54.073 回答