Для 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
person
ikegami
schedule
29.11.2012