Perl: как зарезервировать зарезервированный порт TCP (поэтому будет недоступный URL) - PullRequest
7 голосов
/ 09 октября 2011

Я поддерживаю модуль XML-LibXSLT , и один из тестов должен получить доступ к несуществующему URL.Проблема заключалась в том, что кто-то сообщил, что в их системе существует URL, поэтому я решил выделить случайный порт на локальном хосте, где, я уверен, не будет веб-службы.Это было сделано так:

# We reserve a random port to make sure the localhost address is not
# valid. See:
#
# https://rt.cpan.org/Ticket/Display.html?id=52422

my $sock = IO::Socket::INET->new(
    Proto => 'tcp',
);

my $port = $sock->sockport();

$file = "http://localhost:${port}/allow.xml";

Теперь проблема в том, что $ port определен и допустим (для значения зарезервированного порта) в Linux, но он не работает в Windows - см.этот отчет об ошибке - https://rt.cpan.org/Ticket/Display.html?id=71456.Мой вопрос: как я могу зарезервировать новый, случайный, еще не занятый порт для переноса через UNIX, Mac OS X и Windows в Perl 5?

С уважением,

Shlomi Fish

Ответы [ 4 ]

5 голосов
/ 09 октября 2011

Вы должны иметь возможность bind по адресу обратной связи, используя порт 0 (так что порт будет выделен вам).Для получения бонусных баллов вы можете попробовать connect подключить к себе сокет (вероятно, нигде не нужен, но должен гарантировать, что у него есть адрес)

4 голосов
/ 10 октября 2011

Вы хотите bind сокет к адресу + порт.Это произойдет, если вы укажете LocalAddr (или LocalHost).Если вы не укажете порт (или укажете ноль порта), для вас будет выбран свободный порт.

use strict;
use warnings;
use 5.010;

use IO::Socket::INET qw( INADDR_ANY );

my $sock = IO::Socket::INET->new(
    Proto     => 'tcp',
    LocalAddr => INADDR_ANY,
);

my $port = $sock->sockport();

say $port;  # 60110

Я думаю, что вы хотите принимать соединения только от адаптера обратной связи.Если это так, используйте INADDR_LOOPBACK вместо INADDR_ANY.

1 голос
/ 12 декабря 2013

Попробуйте этот небольшой инструмент https://github.com/yegor256/random-tcp-port (я разработчик). Должно работать в Windows, так как это ANSI C.

0 голосов
/ 09 октября 2011

Я подозреваю (но не могу доказать здесь), что в Windows номер порта фактически не выделяется до тех пор, пока сокет не начнет слушать.

Однако фактическое прослушивание этого сокета предотвратит настолько быстрый провал теста, насколько это возможно, поскольку первоначальное TCP-соединение действительно будет успешным.

Рассматривали ли вы просто указание URL-адреса на test.example.com, который гарантированно не существует?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...