有没有办法查看我服务器端的客户端套接字是否已死?

问题描述 投票:0回答:3

当客户端连接到我的服务器端时,如果他们连接到VPN或其他设备,则在它们连接后,服务器端仍然说套接字仍在运行并且仍尝试从中读取数据,我尝试使用另一个线程不断检查我的所有套接字读取并关闭它,如果它返回-1,但仍然不执行任何操作

c server-side client-side
3个回答
0
投票
这很大程度上取决于您使用哪种协议,但是普遍的问题是:是和否。您必须学习网络协议堆栈,才能了解csn在您所处的情况下所做的事情,这些细节您没有透露。

解决该问题的常用方法是建立一些政策或两种方式。例如。在持续时间Y期间,客户端X发送了np数据或“我还活着”消息,我们关闭了连接。或者,向客户端C发送常规“ ping”消息,并期望在期限Y到期之前做出响应。


0
投票
如果我们正在谈论TCP,并且如果客户端的连接已正确关闭,则会向服务器发送一条消息,因此服务器将知道该连接已关闭,因此read / recv将返回0个字节,指示EOF。

但是您正在询问客户端无法与服务器通信的时间。必须使用超时来检测是否缺少消息。

  1. 您可以让服务器定期“ ping”客户端(发送客户端必须响应的消息)。
  2. 您可以让客户端在空闲时定期发送消息(“心跳”)。]
  3. 无论哪种方式,X秒钟内没有任何消息(任何形式的消息都表明连接断开。


0
投票
如果在每个新的TCP连接上启用SO_KEEPALIVE套接字选项,则OS将定期自动ping通远程端以查看其是否仍然响应,如果没有响应,则关闭该连接。默认超时是几个小时,但是许多操作系统允许您基于每个套接字配置较低的超时。不幸的是,每个人在执行此操作上都不同。例如,Linux使用TCP_KEEPIDLE套接字选项。 NetBSD(可能还有其他BSD)使用TCP_KEEPALIVE。依此类推。
© www.soinside.com 2019 - 2024. All rights reserved.