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

2024-04-03

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

bash$ (echo -n "abcd" ;sleep 50 ; echo "efgh") |数控本地主机 9090

服务器阻塞 50 秒。在我的完整代码中,我有不止一个IO::Select::INET。我有另一个套接字侦听其他端口(1234),当服务器因睡眠而阻塞时,我无法处理该端口中的任何内容。我尝试改变getline by getc但我只读了第一个字母“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.

Change

    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";
        }
    }

to

    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";
        }
    }

And add my %bufs;在选择循环之外。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

perl,使用 IO::Select 和 IO::Socket::INET 读取阻塞 的相关文章

  • 在 Unix 中,我可以在目录中运行“make”而无需先 cd 到该目录吗?

    在 Unix 中 我可以运行make在没有的目录中cd首先进入该目录 make C path to dir
  • 什么是接口标识符

    我有一台笔记本电脑 使用一个或多个网络适配器连接到我组织的网络 我正在尝试编写一个工具来持续监控每个网络的连接状态和连接质量 然而 我的网络知识有限 术语让我感到困惑 特别是查找所有网络适配器 有人建议我使用命令ifconfig它给了我所谓
  • 套接字发送并发保证

    如果我在两个进程 或两个线程 之间共享一个套接字 并且在这两个进程中我尝试发送一条阻塞的大消息 大于下划线协议缓冲区 是否可以保证这两个消息将按顺序发送 或者消息可以在内核内部交错吗 我主要对 TCP over IP 行为感兴趣 但了解它是
  • Perl:避免从标准输入贪婪读取?

    考虑以下 perl 脚本 read pl my line
  • 如何解除阻塞在 ServerSocket.accept() 上的线程?

    我有一个带有以下代码的服务器线程 public void run try ServerSocket server EneaLog printLog Server is running server new ServerSocket this
  • 将用户添加到组但运行“id”时未反映

    R 创建了一个名为 Staff 的组 我希望能够在不以 sudo 身份启动 R 的情况下更新软件包 所以我使用以下方法将自己添加到员工中 sudo usermod G adm dialout cdrom plugdev lpadmin ad
  • perl生成字符串来匹配正则表达式

    我尝试找到一种方法来生成与正则表达式匹配的字符串 例如以下正则表达式 A Z 6 6 A Z2 9 A NP Z0 9 A Z0 9 3 3 0 1 我尝试过 Cpan 上的一些 perl 模块不起作用 gt 字符串 随机 gt 正则表达式
  • 当一个模块安装了两个版本时 Perl 会做什么?

    我在正在使用的远程机器上没有 root 访问权限 因此我使用 cpanm 和 local lib 的组合 如下所述here https stackoverflow com a 2980715 1156644将 CPAN 模块安装到我的本地目
  • 是否有我可以运行的操作系统命令来确定是否在基于 Xen 的虚拟机内运行

    我可以在基于 Xen 的虚拟机中运行一个操作系统命令来告诉我它是一个虚拟机而不是物理机 我听说内核对此有一些自我意识智能 例如就像 ps 输出中的额外列之类的 我知道 vmstat 提供了 st 列 但我在运行 Linux 内核 2 6 1
  • Perl Mongo 查找对象 ID

    你会认为这是一件简单的事情 我有一个集合中的对象 ID 列表 我想根据对象 ID 获取单个记录 谷歌搜索过 但没有任何帮助 所以我有对象 ID 5106c7703abc120a04070b34 my client MongoDB Mongo
  • Bash 中 $() 和 () 之间的区别

    当我打字时ls l echo file 支架的输出 这只是简单的回显 被获取并传递到外部ls l命令 就等于简单的ls l file 当我打字时ls l echo file 我们有错误 因为不能嵌套 内部外部命令 有人可以帮助我理解之间的区
  • 哪一个代表null? undef 或空字符串

    我想插入null在表的一列中 哪一个代表null undef或空字符串 应该使用哪一种 为什么 我知道关于defined我可以检查一下 但我更多的是从数据库的角度来看 代表哪一个null更合适吗 Update 我在用DBI module D
  • Socket.*Async 方法是线程化的吗?

    我目前正在尝试找出最小化 TCP 主服务器中使用的线程数量的最佳方法 以便最大限度地提高性能 由于我最近阅读了大量 C 5 0 的新异步功能 异步并不一定意味着多线程 这可能意味着将有限状态对象分成较小的块 然后通过交替与其他操作一起进行处
  • shell 脚本:错误的解释器:使用 pwd 时没有这样的文件或目录

    我想用 for 循环遍历目录中的文件 但这出现了 echo bad interpreter No such file or directory code bin bash count 0 dir pwd echo dir FILES ls
  • Android 连接有时会被拒绝(并非所有时候)

    我编写了一个 WiFi Direct 代码连接并在它们之间创建了一个连接 然后我创建了一个ServerSocket在第一面和一个Socket在客户端并开始在它们之间发送数据 第一次启动应用程序时它工作成功 但是当我关闭应用程序并再次启动它时
  • 如何使用 Perl 从 NCBI 获取 FASTA 核苷酸格式的基因特征?

    我可以手动下载 FASTA 文件 如下所示 gt lcl CR543861 1 gene 1 ATGCTTTGGACA gt lcl CR543861 1 gene 2 GTGCGACTAAAA 通过单击 发送到 并选择 基因特征 FAST
  • perl xs - 从 c 数组返回 perl 数组

    使用 XS 我尝试将值从 C 数组传递到可在脚本中使用的 Perl 数组 这是我的 xs 文件中的代码 AV DoubleArray getPerlArray CODE r newAV for size t i 0 i lt THIS gt
  • 使用 perl 比较两个 Unicode 字符串

    当我运行以下代码时 它不会进入 在此处执行某些操作 部分 my a P 3 lt 1 my b P 3 lt 1 if a ne b do something here 还有另一种方法可以将 Unicode 字符串与 perl 进行比较吗
  • UDP 广播发送失败:在 Linux 2.6.30 上“网络无法访问”

    我用udp广播写了一个程序 代码段如下 struct sockaddr in broadcast addr socklen t sock len sizeof broadcast addr bzero broadcast addr sock
  • Erlang get_tcp:recv数据长度

    I user gen tcp recv Socket 0 用于数据接收 但我只能接收1次1418字节 我怎样才能收到发送的数据量 in gen tcp recv Socket 0 您正在询问内核 给我接收缓冲区中现在可用的所有数据 不过 内

随机推荐

  • CMAKE_*_OUTPUT_DIRECTORY 的正确使用

    前言 我是only谈论本地编译 not关于安装项目 这是因为我还没有对适当的研究进行足够的研究install使用 CMake 但如果我的问题直接涉及到 请插话install实践 似乎有可能 TL DR 你在什么场景下not想要将所有正在构建
  • React 中未使用 ES6 fetch 定义 fetch 方法

    我在我的第一个 React js 应用程序中遇到了 fetch 函数的问题 这是我的项目的结构 hello world app components main jsx node modules public build js index h
  • 编写 HTML 电子邮件时的最佳实践和注意事项 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我开发网站已有十多年了 但很快发现我的许多网络开发习惯在为电子邮件客户端开发时毫无用处 这让我非常沮丧 所以我想问一个问题 对于像我这样不时为
  • React-Leaflet:将地图控制组件放置在地图之外?

    这是我的其他问题的更普遍的版本 从反应传单中的地图中删除缩放控制 https stackoverflow com questions 59432189 remove zoom control from map in react leafle
  • Python 3 和 Tkinter 有缺陷且缓慢

    因此 几个月前 我制作了一个小型 GUI 用于在我正在运行的角色扮演活动中处理 NPC 从那以后我就再也没有接触过 只是现在我需要它 明天 事实上 我有一些奇怪的错误 加载 GUI 似乎工作正常 但是当我开始按下按钮时 麻烦就开始了 起初
  • Git 合并并修复具有两个分支的混合空间和选项卡

    我已经经历了一些类似的 SOQ 但没有找到适合这种情况的适当解决方案 我注意到在许多文件中 用于缩进的制表符和空格混杂在一起 目前我们遵循的编码标准使用 4 个空格作为制表符 虽然这个问题应该在发生时就得到解决 但我现在需要考虑它 并希望修
  • 广播接收器在 Android 6.0 Marshmallow 中不工作

    我刚刚将我的 Nexus 5 更新到 android 6 到目前为止我的应用程序工作正常 但现在广播接收器无法工作 新版本有什么变化吗 这是我尝试过的代码 它适用于以前的版本 但不适用于棉花糖 安卓清单
  • 如何识别模板参数是否为 std::complex?

    如何判断模板参数是否为std complex 我想要一个支持所有数据类型 如 float double int 等 的通用方法 我知道使用 std is same 我可以专门检查给定类型 例如 std complex
  • 使用 System.Text.Json 自定义可选属性的 JSON 序列化器

    我正在尝试实现一个处理两者的 JSON 序列化机制null和缺失的 JSON 值 以便能够在需要时执行部分更新 这样当值缺失时它不会触及数据库中的字段 但当值显式设置为时它会清除它 null 我创建了一个从 Roslyn 复制的自定义结构O
  • 从另一个 Jenkins 管道构建一个 Jenkins 管道时覆盖默认参数

    目标 当我从另一个 Jenkins 脚本构建时 用 false 覆盖 Jenkins 布尔参数默认值 true 我已经检查了其他 StackOverflow 项目中建议的可能答案 似乎没有什么匹配的 然而 他们确实向我展示了如何在从另一个
  • 使用 Apache httpclient 进行 https

    我已经在 tomcat 中启用了 https 并拥有用于服务器身份验证的自签名证书 我使用 Apache httpClient 创建了一个 http 客户端 我已经设置了一个加载服务器证书的信任管理器 http客户端可以毫无问题地与服务器连
  • 在 XML 中设置微调器模式

    在代码中定义微调器时 可以将模式设置为 对话框 或 下拉 Spinner Context上下文 int模式 使用给定上下文的主题和提供的显示选项模式构造一个新的微调器 但在 XML 中定义布局时我找不到此选项 我是否错过了它 或者这在 XM
  • 调试会话

    作为性能测试的一部分 我需要调试会话等 如果我删除 则会运行相同的代码session gt 当我添加它时 它说模拟期间没有发送任何请求 因为它没有发送任何请求 val scn1 scenario LaunchAction exec sess
  • 有效电子邮件地址的最大长度是多少?

    有效电子邮件地址的最大长度是多少 它有任何标准定义吗 电子邮件地址不得超过254人物 IETF 接受了以下内容 可以对任何给定地址进行全面诊断online http isemail info RFC 3696 的原始版本将 320 描述为最
  • 一元加运算符在 Excel 公式中起什么作用?

    这个看似微不足道的操作在公式中的许多情况下都非常有用 A 否则会引发错误的函数 QUOTIENT A1 A3 4 WORKDAY A1 A3 7 B 将范围转换为数字 即任何文本为零 N A1 C3 C 返回来自不同工作表的混合数据数组 C
  • 无效的流标头:2C6D0005 - StreamCorruptedException

    我从 servlet 应用程序下载了一个序列化的 Java 对象 当我尝试用 Java 代码打开它时 我得到 java io StreamCorruptedException 无效的流标头 2C6D0005 我搜索了互联网 但找不到任何代码
  • 有没有办法获得 typeof Func

    简洁版本 我们可以得到typeofFunc
  • R 2.14 字节编译 - 为什么不呢?

    为什么我不对我安装的所有软件包进行字节编译 字节编译是否会产生一些后果 使其成为需要考虑的决定 一个缺点是您无法调试字节编译的代码 另一方面 一旦 代码已准备好用于生产 理论上您不需要它 如果需要 您可以重新安装它而不进行字节编译
  • google.script.run.withSuccessHandler 不返回值

    这让我抓狂 代码昨天还可以工作 但现在不行了 我尝试再次检查所有语法 但问题仍然存在 来自 Google Sheets 的此服务器端请求显示服务器端的值 Logger log 但返回null在客户端 function supervisorL
  • perl,使用 IO::Select 和 IO::Socket::INET 读取阻塞

    该服务器工作正常 但如果我这样做 bash echo n abcd sleep 50 echo efgh 数控本地主机 9090 服务器阻塞 50 秒 在我的完整代码中 我有不止一个IO Select INET 我有另一个套接字侦听其他端口