我有一个客户端-服务器应用程序,其中每一方都通过 TCP 套接字与另一方通信。
我正确地建立了连接,然后在客户端将任何数据写入套接字之前使服务器崩溃。
我看到的是第一个 write()
尝试(客户端)是成功的,它返回实际写入的字节数,而以下的返回(如我所料)-1
(接收 SIGPIPE
)和 errno=EPIPE
。
为什么即使套接字已经关闭,第一个 write()
也会成功?
编辑
有时下面的write()
也会有一个正的返回值,好像一切顺利。
最佳答案
您对 write()
的返回值的含义感到困惑。这并不意味着“对等方获得了数据并确认了它”。相反,它意味着,“我缓冲了这么多字节以发送给对等方,现在它们是我的责任,所以你可以忘记它们(而且我没有任何未决错误)”。
也就是说,如果 TCP 堆栈接受写入并返回 n 字节,这并不意味着它们已经被写入,只是排队等待写入。在它开始发送网络流量后,堆栈会放弃并向您返回错误之前,这将需要一些时间,可能需要 30 秒。在那段时间里,您可能已经多次调用 write()
,这些调用成功地排队发送数据。 (如果对等点消失,写入错误将在 c.30s 返回,或者如果可以联系到对等点并立即发送 RST 数据包以指示连接已断开,则立即返回。)
关于c - 在对等方关闭的 TCP 套接字上写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15406097/