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

Linux套接字编程:当客户端套接字在通信过程中发生故障时,服务器套接字会发生什么

邵伟泽
2023-03-14

假设通过网络在两个套接字之间建立tcp连接。一个是服务器端,另一个是客户端。

  • 谢谢

共有1个答案

慕金林
2023-03-14

当客户出现故障时会发生什么?从套接字编程的角度。假设我们已经为此编写了自己的套接字程序。

“client is down”,我假设您的意思是“某人把客户端机器的以太网线拉出了墙”,即客户端计算机突然完全失去了与服务器的通信(而不是“客户端程序崩溃/退出”,这是一种不同的、更简单的情况,因为在这种情况下客户端计算机的OS仍然可以向服务器解释发生了什么)

在那种情况下,将发生的情况是服务器将停止接收从客户端返回的任何数据包。这意味着它不会再接收客户机发送的任何数据(很明显),但这也意味着服务器也不会接收任何ACK数据包来响应它发送给客户机的数据。

另一方面,如果服务器没有尝试向客户机发送任何数据,那么服务器就无法知道客户机已经离开,在这种情况下,可能需要几个小时(或者永远也不会,这取决于您是否在套接字上启用了TCP keepalive)才能执行任何操作。(这就是为什么许多基于TCP的程序定期通过空闲的TCP套接字发送虚拟数据的原因,这样它们就会尽早发现连通性已经消失。)

TCP堆栈中发生了什么?

在TCP堆栈内部有逻辑(从概念上讲)监视系统中每个TCP套接字的传出数据缓冲区,每当套接字的缓冲区中存在数据字节时,TCP堆栈就会尝试将这些数据传递到远程主机。它通过发送TCP数据包来实现这一目的,如果它没有从远程对等方收到这些数据包的确认,过一段时间它将再次尝试发送这些数据包。当确认继续没有被接收到时,它将为每次重试等待越来越长的时间,并且/或者降低数据包的发送速率,希望减少网络拥塞,使某些数据能够通过(请记住,服务器无法知道客户机为什么没有响应)。最终它会决定继续没有意义,然后它会放弃并关闭TCP连接。

谁来处理这些情况?无论是TCP堆栈还是套接字程序都必须有自己的智能?

两层都要处理。TCP堆栈的send-more-TCP-data例程处理对死套接字的检测,并将该情况传达给套接字程序(如上所述),然后由套接字程序来优雅地处理死连接(通常是通过关闭()--中断的TCP套接字并继续不使用它)。

 类似资料:
  • 我正在学习套接字编程,服务器套接字让我感到困惑。我为服务器套接字写了两个场景,请看一下: null 如果我的一个假设是正确的,那会回答下面的问题吗?或者,我的两种设想都是错误的。如果你能指导我找到正确的答案,或者至少是一些相关的文本来学习,我将非常感谢。

  • 我对套接字有点陌生,我正在尝试编写一个程序,在这个程序中,我基本上可以从客户端程序向服务器程序发送一些简单的请求。现在我只想在客户端有1或2个选项供用户选择。例如,如果用户在客户端选择“选项1”,那么服务器会返回一条消息“您选择选项1”,以此类推,但我不知道如何读取服务器上从客户端发送的输入。 客户代码: 服务器代码: 我需要在Clinet中使用两个不同的BufferedReader吗?一个用于用

  • 问题内容: 我试图用没有gui的服务器连接带有gui的客户端。连接已完成,但我看不到这两个应用程序之间的任何消息。(我应该在客户端中找到SERVER HERE,在服务器中找到CLIENT HERE) 客户端连接代码: (输入和输出在此客户端类扩展到的GUI类中定义。定义为“受保护的BufferedReader输入;受保护的PrintWriter输出;”) 另外,服务器代码: 连接似乎还可以,所以我

  • 我正在尝试连接一个带有gui的客户端和一个没有gui的服务器。连接正在进行中,但我看不到这两个应用程序之间的任何消息。(我应该将服务器放在客户端中,而将客户端放在服务器中) 客户端连接代码: PS:我也在服务器中尝试了PrintWriter,也尝试了try catch in stream语句,问题仍然存在。

  • 我试图用java实现一个客户端服务器,在这里我读取客户端中的输入并在服务器中执行UperCase,然后返回客户端并打印UperCase。我使用ObjectOutputStream和ObjectInputStream进行读写,但是当我在客户机中键入一个msg时,程序会显示以下错误: Digite uma msg casa java.io.eofexception位于java.io.datainput

  • 我有这个代码可以在eclipse中与android Studio中的客户端通信服务器,我使用套接字,客户端向服务器发送消息,服务器读取该消息并确定一切正常,但当服务器向客户端发送消息时,客户端不强制任何东西;这是代码 还有这个 此代码是服务器代码的一部分,如果您需要客户端代码(Android Studio),请告诉我。 我需要帮助拜托