这是我的简单服务器。当我运行它并 telnet 到它(端口 5222),并让 telnet 退出其连接时,为什么我的 on_eof 函数没有被调用? IE。为什么字符串不是“CATASTROPHE!!!”打印?
#!/usr/bin/perl
use v5.18;
use warnings;
use EV;
use AnyEvent;
use AnyEvent::Socket;
use AnyEvent::Handle;
our $hdl;
my $server = tcp_server undef, 5222, sub {
my ($fh) = @_;
$hdl = AnyEvent::Handle->new(fh => $fh);
$hdl->on_eof(sub {
my ($handle) = @_;
say "CATASTROPHE!!!";
});
};
EV::run;
tl;dr: 如果不尝试从套接字读取,则无法检测到 EOF。使用->on_eof 或->push_read。
长版:
该示例不尝试从句柄读取任何内容,这就是 AnyEvent::Handle 不尝试读取数据的原因。如果不尝试读取数据,它就无法检测到 EOF(POSIX API 的结果)。
此行为仅在 start_read/stop_read 方法的描述中间接描述:
请注意,当您更改“on_read”回调或推送/取消移动读取时,AnyEvent::Handle 将自动为您“start_read”
回调,以及它
当“on_read”未设置且队列中没有任何读取请求时,将自动为您“stop_read”。
其行为如此的原因是,在基于事件的程序中,读取数据(内部完成)和将读取回调排入队列之间可能存在任意时间。由于接收非预期数据是一个错误(并且由于不犯该错误可能会使读取缓冲区溢出,从而导致错误),因此需要某种方法来避免这些错误。
当没有请求时不读取数据是避免由于程序“不够快”处理数据而导致的虚假错误的自动方法:AnyEvent::Handle 在程序做出决定之前不会从套接字读取任何内容如何处理数据。
在您相当不典型的示例中,您不对套接字执行任何操作。要检测到 on_eof,您可以调用 ->start_read,但这在现实世界的程序中不太可能有用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)