2
use strict; use warnings;
use IO::Socket;
use IO::Select;
my $read_select  = IO::Select->new();
my $write_select = IO::Select->new();

my $socket = IO::Socket::INET->new(
            LocalHost => '127.0.0.1',
            LocalPort => '5556',
            Proto => 'tcp',
            Listen => 50,
            Reuse => 1,
 ) or die "Could not create socket: $!";

 print "Socket Created . Waiting for connection ...\n";

 ## poll to accept new connection or to receive data from a connection

 $read_select->add($socket);

 print "Added socket to read list ";
 my $reade;
 my $newconn;
 my @read;
 my @write;
 while(1) {
    @read = $read_select->can_read();

    foreach my $reade(@read) {
            if($reade == $socket) {
                    print "New conn received";
                    my $newconn = $reade->accept();
                    $write_select->add($newconn);

            }
            else {
                    print "data received";
            }
    }
 }
 @write = $write_select->can_write();

 foreach my $write(@write) {
    $write->send("got ur data");
 }

我正在尝试使用 select 语句轮询连接。为什么如果我使用无限循环,则不接受任何连接。没有 while(1) 也能正常工作

4

1 回答 1

2

我认为您在这里被 I/O 缓冲所困扰。Perl 缓冲所有输入和输出。它通常在收到整行之前不会打印到终端。

您的代码可能正在使用while(1),但您看不到调试打印语句的输出,因为终端的输出正在被缓冲。一旦你通过循环进入第二次,就会永远$read_select->can_read()阻塞,所以你永远看不到 print 语句的输出。

您可以通过添加\n到每个打印语句的末尾来解决这个问题。另一个选项是设置$| = 1;。这将禁用缓冲。有关缓冲的更多信息,请参阅perlvar 的讨论。$|

于 2013-04-04T11:01:29.837 回答