首页 > 解决方案 > Perl:处理多个非阻塞套接字(服务器)

问题描述

我正在开发一种服务器作为一种网关/路由器,它打开动态数量的入站、非阻塞 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 吗?

谢谢!基督教

标签: perlsockets

解决方案


推荐阅读