为什么在此 AnyEvent::Handle 示例中没有调用 on_eof?

2024-01-26

这是我的简单服务器。当我运行它并 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(使用前将#替换为@)

为什么在此 AnyEvent::Handle 示例中没有调用 on_eof? 的相关文章

随机推荐

  • 这在 Python '\x1b[2K' 中意味着什么?

    我刚刚了解到 要清除用 Python 打印的行 请执行以下操作 sys stdout write x1b 2K 为什么这么复杂 那个奇怪的代码是什么意思 打印命令有其他选择吗 打印确实提供了 结束 选项 允许在行中来回移动 但无法清除打印的
  • 如何在没有调试器的情况下调试程序? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在 Powershell 中写入详细输出不会换行到命令宽度

    我想Write Verbose大量数据保存到一个输出文件中 我是这样做的 Start Transcript Path TargetDir RunUnitTests log Width 1000000 Write Verbose five m
  • 有没有CMYK图形库?

    我正在寻找支持 CMYK 的图形库 JPG 或 TIF 我必须读取一个大图像文件和一个小图像文件 然后在第一个图像文件上写入第二个图像文件 输出也必须是 CMYK 没有任何 CMYK gt RGB 转换 有吗 C C Java 或其他 免责
  • Vagrant 错误:缺少 VT-x/AMD-V 硬件加速

    我想 起 一个流浪盒子 但我收到以下错误 VT x AMD V hardware acceleration is not available on your system Your 64 bit guest will fail to det
  • 求最小长度RLE

    经典的 RLE 算法通过使用数字来表示数字后面的字符在文本中该位置出现的次数来压缩数据 例如 AAABBAAABBCECE gt 3A2B3A2B1C1E1C1E 然而 在上面的示例中 该方法会导致压缩文本使用更多空间 更好的想法是使用数字
  • 如何通过 JavaScript 计算两个日期之间的月份和天数?

    我们使用下面的代码 var oneDay 24 60 60 1000 hours minutes seconds milliseconds var firstDate new Date 2008 01 12 var secondDate n
  • 我应该选择哪种格式在 C# 中请求 API - JSON 或 XML

    我正在从 C 中的 REST API 请求数据 API 以 JSON 和 XML 格式提供相同的数据 我应该去哪一个 它是clear https stackoverflow com questions 4596465 is parsing
  • 在 EaselJS 中缓存 SpriteSheet

    如何在 EaselJS 中缓存 SpriteSheets 我有一个 Sprite 对象 当我使用user hero cache 0 0 30 40 它停止播放动画 可能是因为我只是缓存当前帧 而不是整个 SpriteSheet 图像 那么我
  • R data.table 条件在组内,但在组中的第一个实例中记录

    我的数据看起来有点像这样 df lt data frame ID c rep 1 4 rep 2 2 rep 3 2 4 TYPE c 1 3 2 4 1 2 2 3 2 SEQUENCE c seq 1 4 1 2 1 2 1 ID TY
  • 在struts中上传一个文件和一些数据

    我想通过struts表单上传图像文件和一些数据 处理数据 并将该图像存储在数据库中 我已经为它创建了一个表单 在 struts xml 文件中定义了上传文件的操作 但是当控件采用 java 方法时 文件类型变量中的值为 null 请帮忙解决
  • 如何在 Android 中调整 PIP 模式的大小

    我正在尝试在我的应用程序中实现画中画模式 我正在 PIP 模式下实现 google 地图 但无法调整全屏地图的大小 它始终放大地图中心点 我已经进行了与此问题相关的研发 但没有找到任何正确的答案 基本上 我需要像 Whatsapp app
  • HtmlUnit 访问没有 id 或 Name 的元素

    我怎样才能访问这个元素
  • 我可以将 FlurlClient 与 Asp.Net Core TestServer 一起使用吗?

    我们在一些项目中使用 FlurlClient 并熟悉其流畅的界面 我们现在希望使用 TestServer 在 ASP NET Core 集成测试中使用它 示例来自http asp net hacker rocks 2017 09 27 te
  • 确定测试矩阵结果的有效方法

    相关问题 矩阵组合逻辑 https stackoverflow com questions 13531987 matrix combination logic 笛卡尔积是最好的方法吗 https stackoverflow com ques
  • Julia - 读取大文件的并行性

    在 Julia v1 1 中 假设我有一个非常大的文本文件 30GB 并且我想要并行 多线程 读取每一行 我该怎么办 此代码是在检查后尝试执行此操作Julia 有关多线程的文档 https docs julialang org en v1
  • 是否可以重用backgroundworker对象?

    我有一个 刷新 按钮 每次单击它时我都希望我的后台工作对象能够工作 i use if main news back worker IsBusy true Start the asynchronous operation main news
  • 在 Windows Phone 8 上创建构建

    我想为我的 Windows Phone 8 应用程序构建 如 APK 以进行测试 我该怎么办 当您在 VS 2012 中运行 Windows Phone 8 应用程序时 会在应用程序的 Bin 文件夹中创建一个 XAP 文件 它类似于And
  • 如何使用Vim快速查看Mercurial或Git的变化

    当我在 Vim 中编辑文件时 我想快速突出显示自上次提交以来所做的任何更改 同时仍然能够编辑该文件 有什么可以接近这样做吗 编辑 2020 01 23 快速搜索 仅供参考 发现还有另一个插件似乎与 VCS 无关 https github c
  • 为什么在此 AnyEvent::Handle 示例中没有调用 on_eof?

    这是我的简单服务器 当我运行它并 telnet 到它 端口 5222 并让 telnet 退出其连接时 为什么我的 on eof 函数没有被调用 IE 为什么字符串不是 CATASTROPHE 打印 usr bin perl use v5