gpt4 book ai didi

Linux Socket编程 : what happen in server socket when client socket gone off in the middle of communication

转载 作者:太空宇宙 更新时间:2023-11-04 10:30:37 24 4
gpt4 key购买 nike

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

  1. 当客户端宕机时会发生什么?从套接字编程的角度来看。假设我们为此编写了自己的套接字程序。

  2. TCP 堆栈中发生了什么?

谁来处理这些情况?无论是 TCP 栈还是 Socket 程序都要有自己的智能?

如果重复,请将我指向线程。

  • 谢谢

最佳答案

What happen when client is down ? from socket programming perspective. Assume that we have written our own socket program for this.

“客户端已关闭”,我假设您的意思是“有人将客户端计算机的以太网线从墙上拉了出来”,即客户端计算机突然完全失去了与服务器的通信(而不是“客户端程序崩溃/退出”,这是一种不同且更简单的情况,因为在这种情况下,客户端计算机的操作系统仍然可以向服务器解释发生了什么)

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

从套接字编程的角度来看,假设服务器正在尝试向客户端发送数据,套接字的传出数据缓冲区将填满数据,此时服务器将无法写入()/发送( ) 任何更多数据到该套接字。也就是说,如果套接字处于阻塞模式,下一次对 write()/send() 的调用将阻塞,或者如果套接字处于非阻塞模式,调用将立即出错并返回 errno EWOULDBLOCK。该状态通常会持续一段时间(例如 30 秒到几分钟),直到服务器的 TCP 协议(protocol)逻辑最终厌倦了无结果地重新发送数据包并放弃客户端的响应;此时服务器的 TCP 堆栈将单方面关闭连接。发生这种情况时,对套接字上的 send() 或 write() 的任何调用都会导致发出 SIGPIPE 信号(如果您没有安装信号处理程序,可能会中止服务器程序),或者如果您已经完成信号(SIGPIPE,SIG_IGN),然后 write()/send() 调用将只返回 -1 并将 errno 设置为 EPIPE。

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

What happen in TCP stack ?

在 TCP 堆栈内部有逻辑(从概念上讲)监视系统中每个 TCP 套接字的传出数据缓冲区,只要套接字缓冲区中存在数据字节,TCP 堆栈就会尝试获取该数据传送到远程主机。它通过发送 TCP 数据包来做到这一点,如果它没有从远程对等点获得这些数据包已收到的确认,稍后它将尝试再次发送它们。由于继续收不到确认,每次重试等待的时间会越来越长,和/或降低数据包的发送速率,以期减少网络拥塞足以让一些数据通过(记住服务器已经无法知道为什么客户端没有响应)。最终它会决定继续没有意义,然后它会放弃并关闭 TCP 连接。

Who will handle these situation ? Either TCP stack or Socket program has to have its own intelligence ?

两层都必须处理它。 TCP 堆栈的发送更多 TCP 数据例程处理死套接字的检测,并将该情况传达给套接字程序(如上所述),然后由套接字程序优雅地处理死连接(通常通过 close()-ing 损坏的 TCP 套接字并在没有它的情况下继续。

关于Linux Socket编程 : what happen in server socket when client socket gone off in the middle of communication,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40146833/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com