我正在将服务器开发为一种网关/路由器,它可以打开动态数量的入站,无阻塞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吗?
谢谢! 基督徒