gpt4 book ai didi

c - ECONNRESET 在发送 Linux C

转载 作者:IT王子 更新时间:2023-10-29 01:05:34 25 4
gpt4 key购买 nike

根据 Unix Network Programming当一个套接字向一个关闭的套接字写入两次(在一个 FIN 数据包之后),那么在第一次它成功发送,但从另一台主机收到一个 RST 数据包。由于主机收到 RST,因此套接字被销毁。于是第二次写入时,收到SIGPIPE信号,返回EPIPE错误。

然而,在send man pages可以返回ECONNRESET,表示收到RST包。当它返回 ECONNRESET - 没有返回信号。

ECONNRESET在哪些情况下可以返回?为什么在这种情况下没有 SIGPIPE 信号?

注意:我查过我类似的问题here .然而,当我在我的 linux 计算机上运行时,send 返回了 EPIPE 错误,而不是 ECONNRESET。

最佳答案

如果对等方在套接字缓冲区中仍有未处理的数据时关闭连接,它将发回一个 RST 数据包。这将导致在套接字上设置一个标志,下一次发送将返回 ECONNRESET 作为结果。如果连接被没有未完成数据的对等方关闭,则在发送时返回(或触发 SIGPIPE)EPIPE。在这两种情况下,本地套接字仍处于打开状态(即文件描述符有效),但底层连接已关闭。

示例:想象一个服务器读取一个字节然后关闭连接:

  • EPIPE:客户端发送第一个字节。服务器读取字节并关闭连接后,客户端将发送更多数据,然后再发送一些数据。最新的发送调用将触发 EPIPE/SIGPIPE。
  • ECONNRESET:客户端首先发送多于一个字节。服务器将读取一个字节并关闭套接字接收缓冲区中更多字节的连接。这将触发来自服务器的连接 RST 数据包,在下一次发送时,客户端将收到 ECONNRESET。

关于c - ECONNRESET 在发送 Linux C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33053507/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com