Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 为什么不是';在这个AnyEvent::Handle示例中调用了t on_eof?_Perl_Anyevent - Fatal编程技术网

Perl 为什么不是';在这个AnyEvent::Handle示例中调用了t on_eof?

Perl 为什么不是';在这个AnyEvent::Handle示例中调用了t on_eof?,perl,anyevent,Perl,Anyevent,这是我的简单服务器。当我运行它和telnet到它(端口5222),并让telnet退出连接时,为什么不调用我的on_eof函数?也就是说,为什么字符串“灾难!!!”没有打印出来 tl;dr:如果不尝试从套接字读取,则无法检测到EOF。使用->打开或->按读 长版本: 该示例不尝试从句柄读取任何内容,这就是为什么AnyEvent::handle不尝试读取数据。如果不尝试读取数据,它就无法检测EOF(POSIXAPI的结果) 此行为仅在“开始读取/停止读取”方法的说明中间接描述: 请注意,当您更改“

这是我的简单服务器。当我运行它和telnet到它(端口5222),并让telnet退出连接时,为什么不调用我的on_eof函数?也就是说,为什么字符串“灾难!!!”没有打印出来


tl;dr:如果不尝试从套接字读取,则无法检测到EOF。使用->打开或->按读

长版本:

该示例不尝试从句柄读取任何内容,这就是为什么AnyEvent::handle不尝试读取数据。如果不尝试读取数据,它就无法检测EOF(POSIXAPI的结果)

此行为仅在“开始读取/停止读取”方法的说明中间接描述:

请注意,当您更改“on_read”回调或推/取消读取时,AnyEvent::Handle将自动为您“启动_read” 回调,它 当未设置“on_read”或队列中没有任何读取请求时,将自动为您“stop_read”

其行为类似于此的原因是,在基于事件的程序中,在读取数据(内部完成)和将读取回调排队之间可能存在任意时间。由于接收不期望的数据是一个错误(并且由于不发生该错误可能导致读取缓冲区溢出,从而导致错误),因此需要某种方法来避免这些错误

当没有请求数据时不读取数据是一种自动避免由于程序处理数据“不够快”而导致虚假错误的方法:AnyEvent::Handle只是在程序决定如何处理数据之前不从套接字读取任何内容


在您相当不典型的示例中,您没有对套接字执行任何操作。要获取检测到的eof,您可以调用->开始读取,但这在现实世界的程序中不太可能有用。

AnyEvent::Intro上的http\u获取示例使用
打开eof
捕获连接关闭。为什么我不应该这样做呢?当我添加一个空的on_read处理程序时,行为是固定的,比如:
$hdl->on_read(sub{say“read!!!”})
。有人知道为什么吗?另请参阅,因为您可能希望在连接发生后的一段时间内推送(或不推送)读取,因此,如果您尚未声明读取处理程序,AnyEvent无法判断突发EOF事件是否过早(on_错误)或(on_EOF)
#!/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;