Perl:处理多个非阻塞套接字(服务器)

时间:2018-08-02 16:20:25

标签: perl sockets

我正在将服务器开发为一种网关/路由器,它可以打开动态数量的入站,无阻塞tcp端口/套接字。套接字数量是从配置文件中动态读取的,因此套接字存储在数组中。

我仅使用一个使用IO :: Select的入站套接字重新使用了较早的代码。

我的新代码使用相应的套接字创建了一个in_lists(IO :: Select)数组。

我当前的问题是: 打开所有插座后,只有最后一个插座可连接-在拒绝连接之前所有插座都可以连接。

## Listen to a guest TCP connection
our @tcpin_sock;
our @in_list;

foreach my $host (@config::hostkeys) {
    # Create In-Port
    $tcpin_sock[$host] = create_in_socket($tcpin_sock[$host], $inport, 'tcp');
    $in_list[$host] = IO::Select->new($tcpin_sock[$host]);

}

while (1) {
    # Listen to incoming TCP guests
    foreach my $host (@config::hostkeys) {
        #print STDERR "Listen for guests for $host...\n";
        if (my @in_ready = $in_list[$host]->can_read(0.2)) {
            foreach my $guest (@in_ready) {
                if($guest == $tcpin_sock[$host]) {
                    my $new = $tcpin_sock[$host]->accept or die "ERROR: It seems that this port is already occupied: $! ($@)\n";
                    my $newremote = $new->peerhost();
                    print STDERR "New guest connection accepted from $newremote.\n";
                    $in_list[$host]->add($new);
                } else {
                    $guest->recv(my $guest_line, 1024);
                    print STDERR $guest_line;
                }
            }
        }
    }
}

我认为我对IO :: Select的处理是错误的,并且它不支持多个列表? 我需要处理多个套接字,但是在每个客户端连接上,在客户端处理内部,我需要知道连接创建到的端口/套接字。

有人知道如何实现这种情况下的IO :: Select吗?

谢谢! 基督徒

0 个答案:

没有答案