gpt4 book ai didi

perl,使用 IO::Select 和 IO::Socket::INET 读取阻塞

转载 作者:行者123 更新时间:2023-12-03 11:50:41 25 4
gpt4 key购买 nike

此服务器工作正常,但如果我这样做

bash$ (echo -n "abcd" ;sleep 50 ; echo "efgh") | nc localhost 9090

服务器阻塞 50 秒。在我的完整代码中,我有多个 IO::Select::INET。我有另一个套接字监听其他端口 (1234),当服务器被 sleep 阻塞时,我无法处理该端口中的任何内容。我尝试通过 getc 更改 getline 但我只读取了第一个字母“a”并且它阻塞了。

有人可以帮助我吗?

use common::sense;
use IO::Select;
use IO::Socket;

use constant PORT1 => 9090;
use constant TIMEOUT => 1;

my $event_socket = new IO::Socket::INET(Listen => 1, LocalPort => PORT1, ReuseAddr => 1)
or die "Can't bind event_socket: $@\n";

my $sel = IO::Select->new;
$sel->add($event_socket);

my $event_emiter = undef;

while(1){
foreach my $sock (my @ready = $sel->can_read(TIMEOUT)) {
if ($sock == $event_socket) {
my $new = $event_socket->accept;
binmode($new, ":encoding(UTF-8)");
$sel->add($new);

$event_emiter=$new;

warn "[event socket] connect from ",$new->peerhost, "\n";
} elsif ($sock == $event_emiter) {
unless($sock->eof){
my $recv_data = $sock->getline;
warn "[event socket] LOL '$recv_data'\n";
} else {
$sel->remove($sock);
$sock->close;
$event_emiter = undef;
warn "[socket] disconnect\n";
}
} else {

$sel->remove($sock);
$sock->close;

warn "[socket] disconnect\n";
}
}
}

最佳答案

您不是阅读可用数据,而是一直阅读到换行为止。始终使用 sysread

改变

    elsif ($sock == $event_emiter) {
unless($sock->eof){
my $recv_data = $sock->getline;
warn "[event socket] LOL '$recv_data'\n";
} else {
$sel->remove($sock);
$sock->close;
$event_emiter = undef;
warn "[socket] disconnect\n";
}
}

    elsif ($sock == $event_emiter) {
our $buf; local *buf = \$bufs{$fh}; # alias $buf = $bufs{$fh};

my $rv = sysread($fh, $buf, 64*1024, length($buf));
if (!$rv) {
if (defined($rv)) { # EOF
# ... Handle anything left in $buf ...
} else { # Error
# ... Handle error ...
}

delete $bufs{$fh};
$sel->remove($sock);
$sock->close;
$event_emiter = undef;
warn "[socket] disconnect\n";
next;
}

while ($buf =~ s/^(.*)\n//) {
warn "[event socket] LOL '$1'\n";
}
}

并在选择循环外添加my %bufs;

关于perl,使用 IO::Select 和 IO::Socket::INET 读取阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13545788/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com