4

Perl 5.10.1 を使用して Linux ボックス (Centos 6) で特定のポートにアクセスしようとしているかどうかを監視する小さなスクリプトを作成しています。ピアホスト リクエストに対して空白のエントリが返されます。理由はわかりません。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";
    }

}

注 - このスクリプトが終了しないのは意図的なものです。最終的にはこれを init スクリプトでラップし、サービスとして実行します。

4

1 に答える 1

1

Perlaccept()には、他のほとんどの関数と同様にエラー コードがあります。accept()誤返品ですのでこちらもご覧ください

したがって、結果として未定義になると、accept()呼び出しにエラーが発生します。accept のエラーは errno 変数 ($!) に保存されます。

同じことが当てはまりますpeerhost()(こちらを参照)。また、失敗してエラー コードを返すこともあります。

何もせずに上記のコードのみを使用すると、accept()失敗したときにシステムの接続制限に達する可能性があります (接続を閉じる必要があります)。rlimit()その数を増やす方法については、 を参照してください。

失敗するケースの 1 つpeerhost()は、リモート接続が既に閉じられている可能性があります。

于 2013-01-03T23:17:54.073 に答える