【问题标题】:How can I specify which port to use in Perl's IO::Socket::INET?如何指定在 Perl 的 IO::Socket::INET 中使用哪个端口?
【发布时间】:2010-04-30 00:05:23
【问题描述】:

我正在使用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"; 

有谁知道怎么回事?

【问题讨论】:

标签: perl inet


【解决方案1】:

Grant McLean 的答案有效,如果您修复缺少的逗号,但此处的“有效”可能与您的预期有关。

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!

这不是因为代码不起作用,而是按预期工作(在我的情况下)。也就是说,与 localhost 端口 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

如果我在端口 8001 上运行 netcat 侦听,我会得到不同的结果:

Socket good!

【讨论】:

  • 感谢 kbenson 和 Grant,现在使用您发布的代码可以正常工作。
【解决方案2】:

根据the documentation,您应该这样做:

$sock = IO::Socket::INET->new(
    PeerAddr  => '127.0.0.1',
    PeerPort  => 8001,
    LocalPort => 9000,
    Proto     => 'tcp'
) or die "Connect error: $!";

【讨论】:

  • 我也试过这种格式,INET 函数调用没有返回有效的套接字。我在代码之后调用了 $sock->print,Perl 抱怨 $sock 是一个未定义的值。
  • 如果新方法返回 undef,那么您应该在 $! 中查找错误消息。我已经添加了上面的错误检查。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-27
  • 1970-01-01
  • 2023-04-03
  • 2012-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多