如何从客户端/服务器端检测到另一方是否丢失了网络连接?

时间:2016-11-29 20:03:04

标签: c++ winsock2 tcpsocket

我正在使用Winsock2,我在IPv4上创建了一个TCP套接字。

我知道如何检测一方是否已关闭连接(检查recv功能的值),但如果一方失去其互联网连接怎么办?

客户端和服务器都无法检测到另一方没有更多连接到网络(使用此方法)。

1 个答案:

答案 0 :(得分:0)

在提出问题之前,您可能至少需要了解OSI模型。 TCP,IPv4与媒体(以太网,互联网)没有任何共同之处,它们封装在其中。我想,你所说的是连接断开的情况(所谓的半开连接)。 TCP使用三次握手过程和四路连接闭包。建立连接后,如果任何一方都没有发送数据,那么没有数据包会交叉使用的媒体。 TCP是空闲协议,在其级别上没有"心跳"消息从客户端发送到服务器。

TCP采用这种方式设计,具有弹性和效率,允许拔掉电缆并重新插入电缆。这种设计也很有效,因为没有“轮询”数据包通过网络发送只是为了检查连接是否仍然存在。为什么它不总是在现实生活中工作?通常要么是因为在重新初始化连接之后,客户端已经通过DHCP分配了新的IP,或者服务器已经将该连接标记为超时。服务器是如何做到的?他们认为如果客户端闲置时间太长,那么连接就可以安全关闭。客户端软件通常旨在在需要时立即重新建立会话。一些需要对会话流进行更严格限制的应用程序级协议使用某种周期性的心跳"数据包,也称为保持活动数据包。有一些ICMP协议客户端或服务器可能尝试使用的东西,但有限制,包括ICMP可能会被NAT路由器或某些防火墙阻止。

有一个典型的例子,当心跳和超时不属于协议:FTP时。它被设计为两个连接,一个是"命令通道"和一个数据传输。为了不用完客户端池,如果在一定时间内没有发送命令,FTP服务器通常会关闭数据连接。如果客户要求" GET"会发生什么?一个大文件?传输完成之前,服务器可能会切断传输。它可以通过" passive"来解决。 FTP,它是服务器端,它响应从客户端登录而创建数据连接。如果客户端无法接收连接,那么这可能是不可能的。其他解决方案是客户定期发送一些"虚拟"不会造成大量流量的命令,例如" PWD" (获取当前文件夹)。

有很多关于半开连接主题的文章,您应该自己决定,哪种设计更合适。