【问题标题】:crash network and consequent state of socket崩溃网络和套接字的后续状态
【发布时间】:2011-08-15 03:24:25
【问题描述】:

我想知道当它工作的网络崩溃时,套接字的状态是如何变化的。我的问题是当我模拟这个网络的崩溃时,控制所有套接字的select() 函数返回给我一些理论上不应该设置的套接字。是不是操作系统在写和读的时候都设置了 crash 的 socket?

【问题讨论】:

    标签: c sockets select-function


    【解决方案1】:

    首先要记住的是,您的计算机通常不知道“网络崩溃”本身何时发生。计算机所知道的只是它是否正在从网络接收数据包。 (某些计算机可能还知道其本地以太网端口上的电信号是否已经消失,但由于网络的更远部分可能会出现故障而不会影响本地以太网电缆上的信号,因此该信息只是偶尔有用)。

    实际上,如果您的计算机和(与之通信的计算机)之间的网络停止工作,您将看到以下效果:

    (1) 您发送的任何 UDP 数据包都将被丢弃而不会留下任何痕迹,并且通常不会有任何错误指示。当然,您也不会收到来自远程对等方的任何 UDP 数据包。

    (2) 您的计算机和远程对等方之间的任何 TCP 连接上的数据流量都会很快停止。在经过一定的超时时间(通常是几分钟)后,操作系统没有收到远程对等方的任何响应,操作系统将“放弃”并将 TCP 连接标记为关闭;此时,您将看到与远程对等方故意关闭连接时所获得的行为相同的行为:也就是说, select() 将返回准备好读取(也可能准备好写入,我忘记了),然后当您尝试在套接字上实际执行 recv() 或 read() 时,您将得到一个 EOF(即阻塞套接字上的 recv() 将返回 0;非阻塞套接字上的 recv() 将返回 - 1)。 (如果网络在超时完成之前恢复,那么你的套接字上的 TCP 流量将恢复,尽管它会开始缓慢恢复并随着时间的推移逐渐再次加速)

    【讨论】:

    • 我正在处理 TCP 连接,并且我有一个代理,我杀死它以模拟网络崩溃。我有第二点的问题。我的套接字都阻塞了,但是我用标志 MSG_DONTWAIT 在准备读取的套接字上调用了 recv,但是它返回了我 0...尽管我使用了 MSG_DONTWAIT 标志,但它返回 0 是否正确?
    • 为了正确模拟网络崩溃,我不会仅仅杀死代理进程,我会拔掉将您的计算机连接到代理的以太网电缆,或者从电源插座上拔下代理。 (如果您只是杀死一个进程,代理的操作系统会礼貌地通知您的客户端计算机 TCP 连接已关闭——在真正的崩溃情况下,这不会发生)。 recv() 返回 0,因为这是 TCP 连接关闭时阻塞 recv() 应该返回的值。
    • 感谢您的帮助。由于我的教授,我必须使用代理(那只是我的教授编写的程序)来模拟崩溃网络。
    【解决方案2】:

    您的描述不清楚,但 select() 可能是在相关套接字上发出 EOS 信号,这并不代表网络“崩溃”,而是对等方有序关闭,可能出乎您的意料。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-24
      • 1970-01-01
      • 1970-01-01
      • 2021-12-28
      • 1970-01-01
      • 2013-02-19
      相关资源
      最近更新 更多