Perl IO :: Socket :: INET, ошибка с неверным аргументом - PullRequest
4 голосов
/ 23 мая 2011

Рассмотрим следующий фрагмент сценария Perl:

use IO::Socket;
# ...
my $sock = IO::Socket::INET->new(
    PeerAddr => $host, # e.g. "google.com"
    PeerPort => $port, # e.g. 80
    Proto => 'tcp'
);
die("no socket: $!") unless $sock;
# ...

В нормальных условиях все работает как положено, но когда интернет-соединение хост-системы неактивно, переменная "sock" пуста и $! имеет сообщение "Неверный аргумент".

Я не правильно использую конструктор INET или это ожидаемое поведение? Если последнее, есть ли способ отличить ошибку «неактивный сетевой интерфейс» от подлинного неверного аргумента метода конструктора?

1 Ответ

8 голосов
/ 24 мая 2011

Вы видите «Неверный аргумент», потому что конструктор пытается разрешить имя хоста, получает ошибку и возвращает EINVAL в $!. Если вы используете IP-адрес в $host, вы увидите настоящую ошибку «Сеть недоступна».

Кроме того, IO::Socket::INET устанавливает $@ для определения ошибки, возвращенной в $!, поэтому, если вы напечатаете $@, а также $!, вы увидите "Bad hostname 'google.com'", который Вероятно, это даже лучшая диагностика, чем "Недоступная сеть", которую вы получите с IP-адресом вместо имени хоста. В обоих случаях должно быть сразу ясно, что происходит.

...