我知道,当对等端的套接字关闭时,会抛出断管错误.

但是,在我的测试中,我注意到,当对等端关闭时,在该端立即"发送"调用并不总是会导致断管错误.

例如:

在关闭对等端的套接字之后(我已经通过调用Closetry 了干净的关闭,并且通过杀死对等方try 了异常关闭),如果我try 发送40个字节,那么我不会得到一个断开的管道,但是,如果我try 发送40000个字节,那么它会立即给出断开管道的错误.

究竟是什么原因导致管道破裂,其行为是否可以预测?

推荐答案

观察网络关闭可能需要时间——总时间名义上约为2分钟(是的,分钟!)在关闭之后,发送到端口的数据包都被认为是死的.在某个点检测到错误情况.通过一次小的写入,您就在系统的MTU内,因此消息将排队等待发送.如果写得很大,你比MTU大,系统会更快地发现问题.如果忽略SIGPIPE信号,则函数将在检测到连接断开时的某个点上返回断开管道的EPIPE错误.

C++相关问答推荐

C sscanf没有捕获第二个参数

你能用自己的地址声明一个C指针吗?

ATmega328P EEPROM未写入

致命:ThreadSaniizer:在Linux内核6.6+上运行时意外的内存映射

X64:并发写入布尔数组

无法在OpenGL上绘制三角形

不同出处的指针可以相等吗?

<;unistd.h>;和<;sys/unistd.h>;之间有什么区别?

在vfork()之后,链接器如何在不 destruct 父内存的情况下解析execve()?

可变宏不能编译

如何将C中的两个字符串与从文件接收的字符串中的字符数进行比较

如何确保我将使用C标准库函数的函数版本,如&getc";,而不是类似函数的宏版本?

为什么这个分配做得不好呢?

C程序向服务器发送TCPRST

即使客户端不发送数据,也会发生UNIX套接字读取

如何在Rust中处理C的longjmp情况?

C struct 中的冒泡排序

传递参数:C 和 C++ 中 array 与 *&array 和 &array[0] 的区别

通过修改c中的合并排序对数组的偶数索引进行排序

多行表达式:C 编译器如何处理换行符?