1

HTTP アナライザーを使用してループ内の小さな LWP ユーザーエージェントを分析していますが、URL にアクセスするたびにポートが変化し続けることに気付きました。

私はVB.Nethttpwebrequestで作成された小さなスクリプトも持っていますが、URLに10回アクセスしてもポート番号は変更されません。

perl の使用中に静的 ip:port を保持することは可能ですか?

4

1 に答える 1

2

HTTP クライアントの場合:

use LWP::Protocol::http qw( );

@LWP::Protocol::http::EXTRA_SOCK_OPTS = (
    LocalPort => $port,
);

特定のインターフェースも使用したい場合は、

@LWP::Protocol::http::EXTRA_SOCK_OPTS = (
    LocalAddr => $ip,
    LocalPort => $port,
);

もちろん、ポートが既に使用されている場合は問題が発生します。これは、別の接続に使用した場合に発生する可能性があります。

use LWP::Protocol::http qw( );
use LWP::UserAgent      qw( );

my $port = 12456;
@LWP::Protocol::http::EXTRA_SOCK_OPTS = (
    LocalPort => 12456,
);

my $ua = LWP::UserAgent->new();
print $ua->get('http://www.example.com/show_port')->content for 1..2;

出力:

>script.pl
12456
Can't connect to www.example.com:80 (10048)

LWP::Protocol::http::Socket: connect: 10048 at .../LWP/Protocol/http.pm line 51.

>perl -E"say $^E=10048"
Only one usage of each socket address (protocol/network address/port) is normally permitted

ポートが再利用されていない可能性が高く、接続は再利用されています。keep_alive => 1LWP::UserAgent コンストラクターに渡して、接続を再利用することもできます。

use LWP::UserAgent qw( );

my $ua = LWP::UserAgent->new( keep_alive => 1 );
print $ua->get('http://www.example.com/show_port')->content for 1..2;

出力:

57842
57842
于 2012-11-29T21:49:12.580 に答える