什么导致了破pipe错误?

我知道,当对方的套接字closures时,抛出了错误的pipe道错误。

但是,在我的testing中,我注意到,当对方closures时,立即在这一侧的“发送”呼叫并不总是导致pipe道故障错误。

例如:

在closures对端的套接字后(我曾尝试通过调用close来清除closures,也通过查杀exception来closuresexception),如果我尝试发送40个字节,那么我不会得到一个坏的pipe道,但是,如果我尝试发送40000字节,然后立即给pipe道错误的错误。

究竟是什么原因导致了pipe道破裂,并预测其行为?

networking接近观察可能需要一段时间 – 在发往端口的数据包全部假定已经死亡之前,closures之后的总时间标称约为2分钟(是,分钟!)。 错误情况在某个时刻被检测到。 用一个小写,你在系统的MTU,所以消息排队发送。 大写,你比MTU大,系统更快地发现问题。 如果忽略SIGPIPE信号,那么这些function将在断开的pipe道上返回EPIPE错误 – 在检测到连接断裂的某个时刻。

套接字的当前状态由“保持活动”活动确定。 在你的情况下,这是可能的,当你发出send调用时, keep-alive活动告诉套接字是活动的,所以send调用将写入所需的数据(40字节)到缓冲区,并返回给出任何错误。

当您发送更大的块时,发送呼叫进入阻塞状态。

发送手册页面也证实了这一点:

当消息不适合套接字的发送缓冲区时,send()通常会阻塞,除非套接字已被置于非阻塞I / O模式。 在非阻塞模式下,它会在这种情况下返回EAGAIN

因此,在阻塞空闲的可用缓冲区的同时,如果主叫方(通过保活机制)通知另一端不存在,则发送呼叫将失败。

提到的信息预测确切的情况是困难的,但我相信,这应该是你的问题的原因。

也许40个字节适合pipe道缓冲区,而40000个字节不适合?

编辑:

当您尝试写入封闭的pipe道时,发送过程会发送一个SIGPIPE信号。 我不知道信号何时发送,或者pipe道缓冲区对此有什么影响。 您可以通过sigaction调用捕获信号来恢复。