当前位置: 首页 > 知识库问答 >
问题:

使用TCP套接字处理客户端断开的最佳方法

鲍理
2023-03-14

我设法创建了基本的远程管理员工具,它运行良好,我使用了基本的tcp套接字和C++中的多线程。我可以用一些功能来远程使用它,这就像90%完成了,但我的软件没有任何东西可以检测客户端断开,除了当客户端手动关闭时,客户端会发送断开消息给服务器,但当用户拔掉网络插头或其他东西时,断开发生时,什么是最好的处理方法,我正在寻找一种专业的方法来做,比如如果客户端断开,服务器会立即检测到哪个客户端断开。

共有1个答案

司空通
2023-03-14

就像@EJP所说的,没有办法即时检测到硬断开,因为本地计算机无法看到网络上正在发生的事情,它只能看到它传出的TCP数据包不再被ACK了。它无法知道ACK的缺失是由于暂时的问题(例如过载的路由器丢弃了一些数据包,或者以太网电缆被拔出,然后很快又重新插上)还是更永久的问题(例如远程计算机崩溃、永久断电或与网络断开)。

您可以做的是确保您的本地应用程序总是定期通过TCP套接字发送数据--或者是实际数据,或者如果您没有任何实际数据要发送,则发送一些虚拟字节,客户端将知道这些字节会忽略。这些“心跳消息”可以每分钟发送一次,或者每几秒钟发送一次,这取决于您愿意为此使用多少额外带宽。

定期发送TCP数据所做的是强制本地计算机的TCP堆栈监视与发送的数据包相对应的ACK;如果它没有收到预期的ACK,它就会重新发送数据包,几轮重新发送后,它就会放弃并关闭TCP连接。大多数TCP堆栈在几分钟内没有接收到ACK后就会放弃。

如果“几分钟”对您来说不够快,您可以要求远程程序每隔几秒钟向您的程序发送某种类型的数据,如果您至少有几秒钟没有从客户端接收到任何数据,则强制关闭TCP套接字。请注意,根据您设置为超时的秒数,这可能会导致“误报”,即您的程序强制关闭实际上仍然可行但暂时陷入僵局的TCP连接;对于您的应用程序来说,这可能是可接受的,也可能是不可接受的。

 类似资料:
  • 我想检查一下我的客户是否断开了连接。根据我的研究,一种可能的方式是我可以继续给客户写信。如果客户端未能接收到消息,则表示已断开连接。我向相应的客户端发送消息“Checking Connection:Client”clientNo。 我将clientNo 1连接到服务器,它接收 客户1 但是当我将另一个客户端连接到服务器时,我的clientNo1停止接收来自服务器的消息,我的clientNo2现在将

  • 我正在编写一个使用tcp套接字的服务器/客户端应用程序,我的问题是如何检测半开放连接,我计划使用keep-alive但有些人建议我做我自己的协议,所以我现在的计划是: 在服务器端: 服务器会等待10秒等待客户端发送数据,如果在给定的时间内服务器没有收到客户端的消息,服务器会将客户端标记为断开连接,否则,如果服务器收到客户端的消息,则会重新设置计时器。 我现在的问题是,这样行吗?还是我做错了?还是一

  • 我正在使用C#window应用程序表单对TCP多线程服务器进行工作,我正在尝试检测客户端的机器是否关闭并断开与服务器的连接。看了一些帖子,有了一些想法: 如何确定tcp是否连接? 我的代码如下: 多谢帮忙。

  • 我正在开发一个通过TCP/IP承载第三方设备的服务器,并且已经经历了突然的连接中断(设备通过蜂窝连接)。我需要找到一种方法来检测断开,而不必将数据写入设备本身。 我的简化套接字代码如下: 如有任何反馈,将不胜感激。

  • 根据唯一标识符(例如,从客户端接收的客户端机密,可能使用TCP连接事件)授权客户端 直接向特定客户端发送消息(基于标识符) 广播消息 更新: > 添加 以将消息发送到单个客户端 我实施的授权方式是好的吗?! Main.java config.java 广播

  • 最大消息长度为64K字节(尽管我可以将其减少到256字节)。 注意:这将运行在一个微小的嵌入式设备上,所以使用像ZMQ这样的消息传递层不是一个选项(没有足够的内存)。 我可以: