我想知道当它运行的网络崩溃时套接字的状态如何变为现实。我的问题是当我模拟这个网络的崩溃时,控制所有套接字的select()
函数返回一些理论上不应该设置的套接字。操作系统可能在写入和读取时都设置了崩溃的套接字?
答案 0 :(得分:1)
首先要记住的是,您的计算机通常不会知道“网络崩溃”本身何时。所有计算机都知道它是否正在从网络接收数据包。 (有些计算机也可能知道本地以太网端口上的电信号是否已经消失,但由于网络中较远的部分可能会下降而不会影响本地以太网电缆上的信号,因此该信息仅偶尔有用)。
实际上,如果您的计算机与(与之通话的计算机)之间的网络停止工作,您将看到以下效果:
(1)您发送的任何UDP数据包都将被丢弃而没有任何跟踪,通常没有任何错误指示。当然,您也不会收到来自远程对等方的任何UDP数据包。
(2)计算机与远程对等方之间的任何TCP连接上的数据流量将快速停止。经过一段特定的超时时间(通常是几分钟),操作系统没有收到远程对等体的任何响应,操作系统将“放弃”并将TCP连接标记为已关闭;此时,您将看到与远程对等方故意关闭连接时所获得的行为相同的行为:即,select()将返回ready-for-read(并且可能还准备写入,我忘了),然后当你尝试在套接字上实际执行recv()或read()时,你将获得一个EOF(即阻塞套接字上的recv()将返回0;非阻塞套接字上的recv()将返回 - 1)。 (如果网络在超时完成之前恢复,那么套接字上的TCP流量将恢复,尽管它将开始缓慢恢复并逐渐再次加速)
答案 1 :(得分:0)
您的描述不清楚,但是select()可能在相关套接字上发出EOS信号,这不代表网络“崩溃”,而是由对等方有序关闭,可能是您意外的。 / p>