[英]perl, read blocking using IO::Select and IO::Socket::INET
該服務器工作正常,但如果我這樣做
bash $(echo -n“ abcd”; sleep 50; echo“ efgh”)| 數控本地主機9090
服務器阻塞了50秒鍾。在我的完整代碼中,我有多個IO::Select::INET
。 我有另一個套接字偵聽其他端口(1234),並且在服務器阻塞睡眠時,無法處理該端口中的任何內容。 我嘗試通過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;
在選擇循環之外。
它在這里阻塞:
my $recv_data = $sock->getline;
這是因為getline()阻止了等待\\n
調用。 相反,您應該sysread()
並將命令匯編在單獨的緩沖區中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.