我有一个客户端-服务器应用程序,其中每一端都通过 TCP 套接字与另一端进行通信。
我正确地建立了连接,然后在客户端将任何数据写入套接字之前使服务器崩溃。
我看到的是第一个write()
尝试(客户端)成功,它返回实际写入的字节数,而以下返回(如我所料)-1
(收到一个SIGPIPE
) and errno=EPIPE
.
为什么是第一个write()
即使套接字已经关闭也会成功吗?
EDIT有时还包括以下内容write()
拥有正的回报值,就好像一切都很顺利。
您对返回值感到困惑write()
方法。这并不意味着“同行获得了数据并承认了它”。相反,它的意思是,“我缓冲了这么多字节发送给对等方,它们现在是我的责任,所以你可以忘记它们(并且我没有任何待处理的错误)”。
也就是说,如果 TCP 堆栈接受写入并返回n字节,这并不意味着它们已经被写入,只是排队等待写入。在开始发送网络流量之后,堆栈会放弃并向您返回错误,这需要一些时间,也许需要 30 秒。在此期间,您可以多次致电write()
成功地将数据排队发送。 (如果对等点消失,则写入错误将在 c.30 秒内返回;如果可以联系对等点并立即发送 RST 数据包以指示连接已断开,则将立即返回写入错误。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)