我有一个读取数据的 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(使用前将#替换为@)