写入所有数据后关闭套接字是否可以?

Is it OK to shutdown socket after write all data to it?

我正在编写简单的 http 服务器。 服务器发送所有数据后,我想 shutdown 套接字。 我认为将 write() 的 return 字节与实际内容长度的套接字进行比较,但我读到 return 值仅意味着数据移动到套接字的发送缓冲区。 (我不确定,我不知道如何检查)

如果是这样,我可以在检查字节相同后立即关闭套接字吗?如果发送的数据需要在服务器发送 FIN 标志后在 TCP 级别重新传输怎么办?

OS 不会 丢弃您在调用 shutdown(SHUT_WR) 时写入的数据。如果另一端已经关闭了它的末端(你可以知道,因为你收到了 0 个字节)那么你应该能够关闭套接字,并且 OS 将保持打开状态直到它发送完所有内容。

FIN 被视为数据的一部分。如果另一端没有收到它就必须重传,并且直到收到它之前的所有内容才会对其进行处理。这称为“正常关机”或“正常关闭”。这与 RST 不同,后者表示应立即中止连接。