c - 在对等方关闭的 TCP 套接字上写入

标签 c sockets tcp sigpipe

我有一个客户端-服务器应用程序,其中每一方都通过 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/

相关文章:

CreateFileMapping用于在win32中创建共享内存

c++ - pthread_create : Passing argument by value

ios - 使用 NSStream 进行 Objective-C 套接字编程

Java 小程序 : Socket fails to connect

c - 重复使用客户端TCP套接字进行多个HTTP连接

tcp - 如何使用自定义服务器手动发送 RST?

c - 如何在函数实现中使用函数的函数参数?

C - 检查文件中的错误

java - 方法 Socket(String, int) 未定义类型

java - 如何解析通过 TCP 收到的损坏消息