c - ECONNRESET 在发送 Linux C

标签 c linux sockets econnreset

根据 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/

相关文章:

c - Write() 给出奇怪的整数符号

c++ - 动态无锁内存分配器

c - Notetaker 漏洞利用问题

mysql - 如何干净地停止Mysql恢复过程

linux - 为什么 iconv 读取的字节数比我指定的多

c++ - 提升套接字 read_until 用于结构

c - C 中的泛型编程 - void*- const-correctness

c++ - 无法编译 Hello Web 服务客户端

c# - 每个套接字地址(协议(protocol)/网络地址/端口)通常只允许使用一次

c++ - QDialog::accept 不响应关闭