在对等端关闭的TCP套接字上写入

Jus*_*ing 3 c sockets tcp sigpipe

我有一个客户端 - 服务器应用程序,其中每一方通过TCP套接字与另一方通信.

我正确建立连接,然后在客户端在套接字上写入任何数据之前崩溃服务器.
我看到的是第一次write()尝试(客户端)成功并返回实际的写入字节数,而后面的返回(如我所料)-1(接收a SIGPIPE)和errno=EPIPE.

write()即使插座已经关闭,为什么第一个成功?

编辑 有时以下也会write()有正值返回值,好像一切顺利.

Nic*_*son 5

你对write()手段的回报价值感到困惑.这并不意味着,"同行得到了数据并承认了它".相反,它意味着,"我缓冲了太多的字节发送给同行,他们现在是我的责任,所以你可以忘记它们(我没有任何未决的错误)".

也就是说,如果TCP堆栈接受写入并返回n个字节,这并不意味着它们已经被写入,只是排队等待写入.在堆栈放弃并向您返回错误之前,它可能需要一些时间,也就是它开始发送网络流量后30秒.在此期间,您可以完成多次调用,write()这些调用成功排队数据以进行发送.(如果对等体消失,则写入错误将在c.30s中返回,或者如果可以联系对等体并立即发送RST数据包以指示连接已死,则立即返回写入错误.)