perl - 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 吗?
谢谢!基督教
解决方案
推荐阅读
- python - 在 python 中,base 37 数字如何表示为字符串?
- regex - 如何从 Jenkinsfile/Groovy 的命令输出中仅以列表形式返回数字?
- firebase - node.js 不支持 firebase 中的推送通知功能吗?
- android - 无法创建进程:执行流式安装 adb:安装失败
- python - pyspark rdd 将多个 json 文件数据合并到一个 rdd
- pandas - 如何在熊猫的数据框中按行分组
- azure - 从 .NET Core 向 Application Insights 跟踪添加自定义维度
- android - 如何在 Android 上的 EditText 上设置属性和 actionEvent
- javascript - 页面在初始页面加载时有效,但如果我刷新页面,我会收到 Zeit、Nextjs 和现在的 404 错误
- mysql - 无法诊断 MySQL 存储过程的问题