我想监听用Perl编写的TCP / IP客户端上的不同套接字。我知道我 必须使用select(),但我不确切知道如何实现它。
有人可以给我看一些例子吗?
答案 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的工作原理。参数控制它是否是监听套接字。