2016-11-29 38 views
-1

我使用Winsock2,并通过IPv4制作了一个TCP套接字。如何从客户端/服务器端检测对方是否失去了网络连接?

我知道如何检测一侧是否关闭连接(检查recv函数的值),但如果一侧失去了互联网连接呢?

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

+1

您需要使用heartbits,当客户端或服务器停止发送它们时,您可以假设在另一端存在问题 – Rama

+0

您能否更好地解释我?是否有关选项KEEP_ALIVE? – Serusar

+0

心跳包含服务器和客户端之间定期发送的一些数据,以确保另一方存活。你可以用一个简单的标签消息和一些定时器逻辑来实现它。 – Rama

回答

0

在问这个问题之前,您可能至少需要了解OSI模型。 TCP,IPv4与媒体(以太网,互联网)没有任何共同之处,它们被封装在其中。我认为,你的意思是什么,是一个连接断开的情况(所谓的半开连接)。 TCP使用三向握手过程和四向连接关闭。连接建立后,如果任何一方都没有发送数据,那么没有数据包会穿过使用的介质。 TCP是空闲协议,在它的层面上没有从客户端发送到服务器的“心跳”消息。

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

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

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

+0

如果我从心理上了解所有这些情况,该怎么办?我知道OSI模型如何工作,我知道TCP如何工作。我问了一种方法来CODE这种情况。我需要处理半开连接。我如何使用Winsock2在C++中执行此操作?我只是无法弄清楚如何实现这一点。我需要在服务器端检测客户端何时放弃其连接,因为我想关闭套接字并退出我的程序。 – Serusar

+0

几乎你需要草拟什么样的协议,你将在客户端和服务器之间使用,涉及到半开状态检测,然后实现它。没有一套完整的工作流程或模式,特别是如果您使用纯API而不是某些库。有网络的例子,你应该研究它们 – Swift

+0

@Serusar作为协议的一部分,很少使用套接字选项https://msdn.microsoft.com/en-us/library/windows/desktop/ee470551(v=vs 0.85)的.aspx – Swift

相关问题