HTTP アナライザーを使用してループ内の小さな LWP ユーザーエージェントを分析していますが、URL にアクセスするたびにポートが変化し続けることに気付きました。
私はVB.Nethttpwebrequest
で作成された小さなスクリプトも持っていますが、URLに10回アクセスしてもポート番号は変更されません。
perl の使用中に静的 ip:port を保持することは可能ですか?
HTTP アナライザーを使用してループ内の小さな LWP ユーザーエージェントを分析していますが、URL にアクセスするたびにポートが変化し続けることに気付きました。
私はVB.Nethttpwebrequest
で作成された小さなスクリプトも持っていますが、URLに10回アクセスしてもポート番号は変更されません。
perl の使用中に静的 ip:port を保持することは可能ですか?
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 => 1
LWP::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