gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 02:33:17 24 4
gpt4 key购买 nike

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

最佳答案

检测套接字是打开还是关闭的方法有3种,但都不是100%完全证明。

第一个是to attempt a read on the socket as follows :

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

如果套接字已有序关闭,即对等方称为 shutdown for writing or called close AND FIN 数据包已到达,则此调用将导致读取长度为 0,表明套接字已关闭。如果您的对等应用程序崩溃,这也会有所帮助,因为操作系统将关闭连接并发送 FIN。但是,如果您的对等计算机已崩溃或您的对等应用程序已锁定,这将无济于事,因为连接的每一端都保持独立状态。

检测断开连接的第二种方法是探测您的对等点。如果您发送一个 0 长度的数据包给您的对端(它应该能够处理)并且应用程序崩溃了,那么您发送第二个 0 长度的数据包您的应用程序将获得 SIG_PIPE 信号 indicating a broken pipe .

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

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

如果您真的必须很快知道连接何时断开,那么最可靠的选择可能是应用程序级检测信号。

关于perl - 如何在 Perl 中测试 TCP 套接字状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2507339/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com