【问题标题】:How to notify about a non responsive TCP server using socket operations?如何使用套接字操作通知无响应的 TCP 服务器?
【发布时间】:2018-02-23 14:17:05
【问题描述】:

我对socket编程的理解主要来源于这个教程:

CS 50 Software Design and Implementation, Lecture 19, Socket Programming

给定一个 TCP 客户端/服务器模型,其中客户端和服务器在两个不同的系统中运行,并且它们之间有一个代理,假设客户端能够通过代理向服务器发送消息,那么服务器突然变得非-响应(说它已重置)。代理和服务器之间的连接会发生什么情况,如何处理?

我的意思是,我可以使用什么技术来检测此类事件、关闭我的连接并向客户端返回错误消息?

我能想到的一种方法是检查代理中的接收缓冲区,如果一段时间内没有数据,则告诉客户端服务器已关闭。但我认为超时是一种原始方法。套接字编程中是否有任何已知的标准方法或替代方法可用?

【问题讨论】:

  • 您是在实现客户端、服务器还是代理?无论哪种方式,TCP 都有一个内置的 keep-alive 心跳,您可以启用它。根据您运行的平台,您可以使用setsockopt(SOL_SOCKET, SO_KEEPALIVE)setsockopt(SOL_TCP, TCP_KEEPCNT/TCP_KEEPIDLE/TCP_KEEPINTVL)WSAIoctl(SIO_KEEPALIVE_VALS)。如果心跳失败,连接就消失了,所以只需关闭它的套接字句柄。
  • "给定 TCP 客户端/服务器模型..." TCP 没有客户端或服务器。客户端/服务器模型是应用层模型。 TCP 在对等主机之间建立连接。

标签: sockets networking network-programming client-server


【解决方案1】:

给定一个 TCP 客户端/服务器模型,其中客户端和服务器在两个不同的系统中运行,并且它们之间有一个代理,假设客户端能够通过代理向服务器发送消息,那么服务器突然变得非-响应(说它已重置)。代理和服务器之间的连接会发生什么

要么:

  1. 什么都没有。
  2. 读取超时,或
  3. “连接重置”错误

完全取决于代理在做什么。如果它正在接收,(2) 或 (3) 如果已经有一个挂起的发送。如果它正在发送,(3),但不是在第一次发送时,因为缓冲。最终,发送将导致 (3)。

以及如何处理?

关闭连接,以及与客户端的连接。如果是重置,您可能希望通过一种技术将其传播给客户端,因为它被广泛滥用,我不会在此记录。如果是读取超时,您甚至可能想尝试将其传播到客户端,只需在五分钟内什么都不做或任何适当的操作,然后关闭或重置连接。

我的意思是,我可以使用什么技术来检测此类事件、关闭我的连接并向客户端返回错误消息?

见上文。

我能想到的一种方法是检查代理中的接收缓冲区,如果一段时间内没有数据,则告诉客户端服务器已关闭。但我认为超时是一种原始方法。

不是。

在套接字编程中是否有任何已知的标准方法或替代方法可用?

见上文。

【讨论】:

  • 感谢您的回答,但如果您可以参考我可以获取的任何材料或网络链接,我将不胜感激“通过一种我不会在这里记录的技术,因为它被广泛滥用”偷偷摸摸比你直接提的更高峰。即使它是一本 2000 页的书,而且答案就在那里,我也不介意把它挖出来。如果您愿意,我什至可以为您提供我的邮件 ID。
  • 您需要以零超时查找 SO_LINGER。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-13
  • 1970-01-01
  • 1970-01-01
  • 2011-12-20
  • 1970-01-01
  • 1970-01-01
  • 2014-08-18
相关资源
最近更新 更多