0

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

4

2 回答 2

1

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

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

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

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

于 2011-04-29T00:33:52.743 回答
0

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

于 2011-04-29T00:56:08.300 回答