【问题标题】:TCP port keeps changing with perl LWP in loopTCP端口随着perl LWP在循环中不断变化
【发布时间】:2012-11-30 14:34:32
【问题描述】:

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

虽然我在 VB.Net httpwebrequest 中也制作了一个小脚本,并且在访问 URL 10 次时并没有改变我的端口号。

是否可以在使用 perl 时保持静态 ip:port?

【问题讨论】:

  • 好的,我们已经确定您的 VB.net 脚本正在使用 keepalive(因此只建立一个连接然后重用它),但您的 LWP 脚本不是(因此每个连接都会获得一个新的本地港口)。而且您似乎在让 LWP 使用 keepalive 时遇到问题。所以在这一点上,我想知道为什么你在乎?用于新连接的新本地端口并没有错或不寻常,keepalive 对效率很有好处(至少当它不导致问题时)但在您的情况下听起来并不重要。你现在想解决什么实际问题?

标签: perl port-number


【解决方案1】:

对于 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

【讨论】:

  • 你可能想localize 这些包变量。
  • 好吧,我根本不是一个优秀的程序员,我刚开始学习,但我似乎无法让它工作。根据分析仪,它不断改变端口。我也尝试过保持活力,但这不起作用:(
  • @user1796805: VB.net 使用 keepalive 吗?你应该可以从你的分析仪上看出来
  • 与你所说的相反,我发布的代码确实像我描述的那样工作。查看更新。
  • @ysth 是的,根据分析器,它在 vb.net 中保持活动状态,它不会更改数字。
猜你喜欢
  • 2017-01-05
  • 2017-07-29
  • 1970-01-01
  • 1970-01-01
  • 2019-03-21
  • 2022-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多