如何在Perl中侦听多个套接字?

时间:2009-12-09 04:54:13

标签: perl sockets

我想监听用Perl编写的TCP / IP客户端上的不同套接字。我知道我 必须使用select(),但我不确切知道如何实现它。

有人可以给我看一些例子吗?

1 个答案:

答案 0 :(得分:4)

使用IO :: Select模块。 perldoc IO::Select包含一个示例。

这是一个客户端示例。不保证没有拼写错误甚至无法正常工作:

use IO::Select;
use IO::Socket;
# also look at IO::Handle, which IO::Select inherits from

$lsn1 = IO::Socket::INET->new(PeerAddr=>'example.org', PeerPort=>8000, Proto=>'tcp');
$lsn2 = IO::Socket::INET->new(PeerAddr=>'example.org', PeerPort=>8001, Proto=>'tcp');
$lsn3 = IO::Socket::INET->new(PeerAddr=>'example.org', PeerPort=>8002, Proto=>'tcp');
$sel = IO::Select->new;
$sel->add($lsn1);
$sel->add($lsn2);
# don't add the third socket to the select if you are never going to read form it.

while(@ready = $sel->can_read) {
    foreach $fh (@ready) {
        #read your data
        my $line = $fh->getline();
        # do something with $line
        #print the results on a third socket
        $lsn3->print("blahblahblah");
    }
}

这太大了,无法放入评论栏

您需要更好地定义您想要做的事情。您已声明需要从端口A读取并写入端口B.这就是上面的代码所做的。它等待数据进入套接字$ lsn1和$ lsn2(端口8000和8001),读取一行,然后在端口8002(socket $ lsn3)上将一些内容写回example.com。

请注意,只有在需要从多个套接字读取时才需要选择。如果您只需要从一个套接字中读取,那么请废弃IO :: Select对象和while循环,然后执行$line = < $lsn1 >。这将阻止直到收到一行。

无论如何,根据您的定义,上述代码是客户端。代码确实主动连接到服务器(在本例中为example.org)。我建议你阅读IO :: Socket :: INET的工作原理。参数控制它是否是监听套接字。