如何在 Perl 中测试 TCP 套接字状态?

2023-12-25

我有一个读取数据的 TCP 套接字。当读取数据时发生错误时,我返回一个 undef (NULL) 值。错误可能是由格式错误的消息或损坏的套接字引起的。有人可以告诉我是否有一个特定的函数可以返回套接字的状态?


有三种方法可以检测套接字是否打开或关闭,但它们都不是 100% 完全证明。

第一个是尝试按如下方式读取套接字 https://stackoverflow.com/questions/2441928/testing-for-a-closed-socket:

my $ret = recv($sockfd, $buff, 1, MSG_PEEK | MSG_NOWAIT);

如果套接字已有序关闭,即对等方调用shutdown用于写作或称为close https://stackoverflow.com/questions/409783/socket-shutdown-vs-socket-close/598759#598759 AND the FIN数据包已到达,则此调用将导致读取长度为 0 的数据,表明套接字已关闭。如果您的对等应用程序崩溃,这也会有所帮助,因为操作系统将关闭连接并发送一个FIN。但是,如果您的对等计算机崩溃或对等应用程序已锁定,这对您没有帮助,因为连接的每一端都保持独立的状态。

检测连接中断的第二种方法是探测您的对等点。如果您向对等方发送一个 0 长度的数据包(应该能够处理)并且应用程序崩溃了,那么您发送第二个 0 长度的数据包,您的应用程序将得到SIG_PIPE signal 表明管道破损 https://stackoverflow.com/questions/2216374/why-is-writing-a-closed-tcp-socket-worse-than-reading-one/2218360#2218360.

处理此问题的另一种方法是使用应用程序级心跳,其中对等点定期向彼此发送心跳数据包,表明它们处于活动状态并且正常运行。

最后一个选择是使用SO_KEEPALIVE套接字选项,尽管它的用途有限,因为它只会在大约 2 小时不活动后检测到损坏的套接字。

如果您确实必须很快知道连接何时断开,那么最可靠的选项可能是应用程序级心跳。

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

如何在 Perl 中测试 TCP 套接字状态? 的相关文章

  • 如何获取可在 \N{} 中使用的所有值来生成特定的代码点?

    在执行调试时这个问题 https stackoverflow com questions 41738241 perl unknown charname nalpha 我问自己 如何找到我可以使用的所有值 N 对于给定的 Unicode 代码
  • 如何编写正则表达式来匹配 Verilog 文件中的模块实例化?

    我正在开发一个项目 通过使用 perl 脚本语言来促进 verilog 编程 现在我想编写一个脚本来扫描顶级verilog文件 然后生成模块的层次结构列表 这表明我需要提取模块实例化 从verilog文件中的语句来看 问题是这样的 如何编写
  • Perl 中围绕散列键的引号是一个好习惯吗?

    在 Perl 中使用散列时引用键是个好主意吗 我正在开发一个非常大的遗留 Perl 代码库 并尝试采用 Damian Conway 建议的许多最佳实践Perl 最佳实践 http oreilly com catalog 9780596001
  • File::Find 是否有更干净的方法来返回所需文件的列表?

    我找到了背后的设计选择File Find find https metacpan org module File 3a 3aFind有点令人惊讶 我遇到过的例子都表明find用在 void 上下文中 The 文档 https metacpa
  • 简单的java http客户端没有服务器响应

    我正在尝试编写一个简单的 Java http 客户端 它只打印出服务器响应的一行 我的问题是我没有收到服务器的响应 这是我所拥有的 它正在编译和运行 没有明显的错误 它只是在我输入主机名后挂起 例如 www google com impor
  • 如何获取已打开连接的套接字 ID/句柄/描述符? (.NET、C++、德尔福)

    我的问题已在标题中说明 我到底该怎么做呢 我有一个开放的连接 我想 劫持 它并通过它发送我的自定义消息 据我了解 这是通过套接字及其处理程序完成的 任何语言都可以 但首选 C NET 谢谢 UPDATE 我到底想要实现什么 我想为 post
  • 如何在C中模拟套接字

    我有一个使用套接字的函数 我会模拟它 但我找不到如何做到这一点 有没有办法在 C 中模拟套接字 Thanks 大多数系统 库函数是弱符号 https en wikipedia org wiki Weak symbol 这意味着您可以创建自己
  • Blackberry 上的套接字连接比 http 更快吗?

    我正在为 Blackberry 编写一个应用程序 该应用程序最初是在标准 J2ME 中实现的 网络连接是使用完成的Connector open socket 80 代替http 现在 我已经使用这两种方法实现了连接 似乎有时 套接字方法响应
  • 为什么没有调用回调?

    我有来自的示例脚本B OP检查 https metacpan org pod B OPCheck SYNOPSIS模块经过修改PL op name to padsv https github com Perl perl5 blob blea
  • UNIX 域 STREAM 和 DATAGRAM 套接字之间的区别?

    这个问题是NOTSTREAM 类型和 DATAGRAM 类型 INTERNET 套接字之间的区别 我知道 STREAM 套接字使用 TCP 数据报套接字使用 UDP 以及所有 TCP UDP 内容 按顺序到达的数据包 ACK NACK 等
  • MongoDB 的简单 HTTP/TCP 健康检查

    我需要为 Docker 容器内的 MongoDB 实例创建运行状况检查 尽管我可以采取解决方法并通过 CLI 使用 Mongo Ping 但最好的选择是创建一个简单的 HTTP 或 TCP 测试 标准 ping 测试中默认 27017 端口
  • Perl 中令人困惑的文件句柄

    一直在使用以下脚本 但仍然无法理解两种不同 类型 的文件句柄形式背后的含义 任何见解将不胜感激 usr bin perl use warnings use strict open FH example txt or die while
  • 如何引用 Perl 子例程?

    我在弄清楚如何引用外部模块文件中的子例程时遇到了一些麻烦 现在 我正在这样做 外部文件 package settingsGeneral sub printScreen print 0 Main use settingsGeneral my
  • Microsoft SQL 数据库的 WebSocket 侦听器

    我目前正在开发一个项目 该项目必须使用 WebSockets 作为将数据传输到客户端的方式 基础设施看起来像这样 客户端 gt Web 服务器 gt Microsoft SQL 数据库 我想最理想的情况应该是这样的 客户端打开一个到服务器的
  • 在 Python ssl 客户端/服务器的情况下自动输入密码短语

    我需要创建客户端 服务器应用程序以将文件从客户端发送到服务器 我使用简单的 ssl 套接字并使用证书进行身份验证 ms socket socket socket AF INET socket SOCK STREAM ssl sock ssl
  • Python 中的 ZeroMQ 和多个订阅过滤器

    我想使用一个套接字使用 Python 中的 ZeroMQ 订阅多个过滤器 sock setsockopt zmq SUBSCRIBE first filter sock setsockopt zmq SUBSCRIBE second fil
  • 使用 TCP 时,发送 1 个大块更好还是发送许多小块更好?

    After I accept 一个连接 然后write 对于客户端套接字 一次性写入要发送的所有数据还是分块发送更好 例如 接受 写入1MB 断开连接 or 接受 写入 256 字节 写入 256 字节 n 断开连接 我的直觉告诉我 底层协
  • 使用 Boost ASIO 且适合 MTU 时,有效负载分为两个 TCP 数据包

    我在 boost asio ip tcp iostream 方面遇到问题 我正在尝试发送大约 20 个原始字节 问题是这个 20 字节的有效负载被分成两个 TCP 数据包 先是 1 字节 然后是 19 字节 简单的问题 为什么会发生我不知道
  • 使用线程时的套接字问题

    闲暇时我一直在做一个python游戏 遇到了一个问题 我正在使用基本线程模块来处理套接字 当我使用一个客户端连接到服务器文件时 它工作正常 但更重要的是 在第一个之后的任何连接都会冻结服务器和第一个客户端 这是服务器的代码 import s
  • 在 perl 中比较两个字符串,无论大小写如何

    无论如何 无论大小写如何 都可以比较两个字符串吗 例如 steve eq STevE lt these would match SHOE eq shoe 你明白了图片 是的 使用uc 大写函数 参见http perldoc perl org

随机推荐