Как я могу указать, какой порт использовать в Perl IO::Socket::INET?

Я использую IO::Socket::INET для создания межпроцессного взаимодействия. в моей программе. Мне нужно использовать определенный номер порта в моем TCP-клиенте. Я следовал примеру в документе Perl, но он не работает. Вот мой код:

старый код (работает):

tx_socket = new IO::Socket::INET->new('127.0.0.1:8001') || die "Can't connect to 127.0.0.1:8001 : $!\n"; 

новый код (не работает):

tx_socket = new IO::Socket::INET->new('127.0.0.1:8001', LocalPort=>9000 ) || die "Can't connect to 127.0.0.1:8001 : $!\n"; 

Кто-нибудь знает, что случилось?


person alex    schedule 29.04.2010    source источник
comment
Почему вы дважды вызываете new для одного и того же объекта? см. stackoverflow.com/questions/429657/   -  person Ether    schedule 29.04.2010


Ответы (2)


Ответ Гранта Маклина работает, если вы исправите пропущенную запятую, но «работает» здесь может быть относительно того, что вы ожидаете.

use IO::Socket::INET;
$sock = IO::Socket::INET->new(
    PeerAddr  => '127.0.0.1',
    PeerPort  => 8001,
    LocalPort => 9000,
    Proto     => 'tcp'
);
die("No socket!\n") unless $sock;
print "Socket good!\n";

Запуск этого дает:

No socket!

Это не потому, что код не работает, он работает так, как ожидалось (в моем случае). То есть ожидается, что соединение с локальным портом 8001 завершится ошибкой, и на другой стороне ничего не прослушивается. Это иллюстрирует полезность отчетов об ошибках:

use IO::Socket::INET;
$sock = IO::Socket::INET->new(
    PeerAddr  => '127.0.0.1',
    PeerPort  => 8001,
    LocalPort => 9000,
    Proto     => 'tcp'
) or die("$!\n");
die("No socket!\n") unless $sock;
print "Socket good!\n";

Какой запуск теперь дает:

Connection refused

Если я запускаю netcat для прослушивания порта 8001, я получаю другой результат:

Socket good!
person kbenson    schedule 29.04.2010
comment
Спасибо kbenson и Grant, теперь он работает с использованием кода, который вы разместили. - person alex; 29.04.2010

Согласно документации, вы должны сделать что-то вроде:

$sock = IO::Socket::INET->new(
    PeerAddr  => '127.0.0.1',
    PeerPort  => 8001,
    LocalPort => 9000,
    Proto     => 'tcp'
) or die "Connect error: $!";
person Grant McLean    schedule 29.04.2010
comment
Я также пробовал этот формат, вызов функции INET не возвращает допустимый сокет. Я вызвал $sock-›print после кода, Perl жалуется на то, что $sock является неопределенным значением. - person alex; 29.04.2010
comment
Если новый метод возвращает undef, вам следует искать сообщение об ошибке в $!. Я добавил проверку ошибок выше. - person Grant McLean; 29.04.2010