我知道关闭对等端的套接字时会引发管道破裂错误。
但是,在我的测试中,我注意到,当对等端关闭时,在此端立即进行“发送”调用并不总是会导致管道错误。
例如:
关闭对等端的套接字后(我尝试通过调用close进行干净关闭,也通过杀死对等体来异常关闭),如果我尝试发送40个字节,则管道不会断开,但是,如果我尝试发送40000字节,则立即给出管道中断错误。
究竟是什么原因导致管道破裂,并且可以预测其行为?
Answers:
套接字的当前状态由“保持活动”活动确定。在您的情况下,有可能在发出send
调用时,keep-alive
活动会告知套接字处于活动状态,因此send
调用会将所需的数据(40字节)写入缓冲区,并返回而不会出现任何错误。
当您发送更大的块时,发送调用将进入阻塞状态。
发送手册页也确认了这一点:
当消息不适合套接字的发送缓冲区时,除非套接字已置于非阻塞I / O模式,否则send()通常会阻塞。在非阻塞模式下,在这种情况下它将返回EAGAIN
因此,在阻塞可用空闲缓冲区的同时,如果(通过保持活动机制)通知调用方另一端不再存在,则发送调用将失败。
使用上述信息很难预测出确切的情况,但是我相信,这应该是您遇到问题的原因。