网络崩溃和套接字的后续状态

标签 c sockets select-function

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

最佳答案

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

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

(1) 您发送的任何 UDP 数据包都将被毫无踪迹地丢弃,并且通常没有任何错误指示。当然,您也不会从远程对等点收到任何 UDP 数据包。

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

关于网络崩溃和套接字的后续状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5826325/

相关文章:

聊天服务器套接字

C、socket编程: Connecting multiple clients to server using select()

c - 如何获取我连接的接口(interface)

c# - 调用 C dll 函数来更改 C# 中传递的参数

c - 如果我强制第一个和最后一个为 10 长度字符串中的字母,如何强制用户在字符串中仅插入数字?示例 S2351566A

C - 有效地忽略行尾的额外输入,同时仍然检查是否发送了所有需要的输入

C - 填充 TCP 套接字发送缓冲区

c - 如何处理recv返回

algorithm - 套接字库轮询与自定义轮询

Java Android 套接字线程