1

我正在使用 HTTP 分析器循环分析一个小型 LWP 用户代理,我注意到每次访问我的端口的 URL 都在不断变化。

虽然我在 VB.Net 中也制作了一个小脚本,httpwebrequest并且在访问 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 => 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
于 2012-11-29T21:49:12.580 回答