如何使用套接字操作通知有关不响应的TCP服务器?
我对socket编程的了解主要来自本教程:如何使用套接字操作通知有关不响应的TCP服务器?
CS 50 Software Design and Implementation, Lecture 19, Socket Programming
由于在客户端和服务器在两个不同的系统和代理运行的TCP客户机/服务器模型是在它们之间,假设客户端可以通过代理将消息发送到服务器,然后服务器突然变得不响应(说它被重置)。代理和服务器之间的连接会发生什么,以及如何处理?
我的意思是,我可以采用什么技术来检测这样的事件,关闭我的连接,并向客户端返回错误消息?
我能想到的一种方法是检查代理中的接收缓冲区,如果一段时间内没有数据,告诉客户端服务器已关闭。但我认为超时是一种原始的方法。在套接字编程中是否有已知的标准方法或替代方案?
给出一个TCP客户机/服务器模型,其中客户端和服务器在两个不同的系统上运行和代理在他们之间,假定客户端能够通过代理将消息发送到服务器,然后服务器突然变得没有反应(说它被重置)。恰好代理和服务器
无论之间的关系是什么:
- 没有。
- 一个读取超时,或
- 一个“连接重置”错误
完全依靠什么代理做根据。如果它正在接收,(2)或(3)是否已经有待处理的发送。如果它正在发送,(3),但不是第一次发送,因为缓冲。最终发送会导致(3)。
以及如何处理?
关闭连接,并连接到客户端。如果是重置,您可能需要通过一种技术将其传播给客户端,因为这种技术被广泛滥用,所以我不会在这里记录。如果它是一个读取超时,你甚至可能想通过简单地做五分钟或任何适当的事情来将其传播给客户端,然后关闭或重置连接。
我的意思是,我可以采用什么技术来检测这样的事件,关闭我的连接,并向客户端返回错误消息?
参见上文。
我能想到的一种方式是检查代理中的接收缓冲区,如果一段时间内没有数据,告诉客户端服务器已关闭。但我认为超时是一种原始的方法。
不是。
是否有任何已知的标准方法或替代方案可用于套接字编程?
参见上文。
您正在实施客户端,服务器还是代理?无论哪种方式,TCP都有一个可以启用的内置保持活动心跳。根据您运行的平台,您可以使用'setsockopt(SOL_SOCKET,SO_KEEPALIVE)'或'setsockopt(SOL_TCP,TCP_KEEPCNT/TCP_KEEPIDLE/TCP_KEEPINTVL)'或'WSAIoctl(SIO_KEEPALIVE_VALS)'。如果心跳失败,连接消失,所以请关闭您的套接字句柄。 –
“_提供TCP客户端/服务器模型..._”TCP没有客户端或服务器。客户机/服务器模型是一个应用程序层模型。 TCP建立对等主机之间的连接。 –