You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux下TCP连接recv/send的纯网络errno值列表及相关疑问

Linux下TCP连接建立后recv/send的网络相关errno分析

一、错误分类界定

先明确你划分的三类错误边界:

  1. 编程/内存类错误:由代码逻辑或内存问题导致,与网络状态无关,比如EBADF(无效文件描述符)、EFAULT(用户空间地址无效)、EINVAL(参数非法)、ENOMEM(内存不足)等,本文不展开这类错误。
  2. 特殊错误:属于可重试或非致命的临时状态,包括EWOULDBLOCK/EAGAIN(非阻塞模式下无数据可读写)、EINTR(系统调用被信号中断),这类错误通常不需要判定连接失效。
  3. TCP连接终止类错误:由网络层或传输层的连接异常导致,属于纯网络错误,是本文重点补充的部分。

二、recv可能返回的连接终止类errno

除你提到的ECONNRESET、EHOSTUNREACH、ETIMEDOUT、ENETUNREACH,还需关注:

  • ECONNABORTED:连接被本地主机中止(比如系统因异常主动终止已建立的连接)
  • EHOSTDOWN:目标主机已宕机(与EHOSTUNREACH的区别:前者是确认主机不可用,后者是路由无法到达目标主机)

三、send可能返回的连接终止类errno

除你列出的EPIPE、ECONNRESET、EHOSTUNREACH、ETIMEDOUT,补充:

  • ECONNABORTED:连接被本地主机中止
  • ENETUNREACH:本地路由表无目标网络的可达路径,导致send数据包无法路由时触发
  • EHOSTDOWN:目标主机宕机,send数据包无法送达

四、关于ENETUNREACH的文档问题

ENETUNREACH属于IP层错误,理论上应在ip(7)手册中说明,但部分Linux发行版的手册确实未明确提及它在已建立TCP连接后recv/send中的返回场景。这并非严格的文档疏漏,更多是因为该错误触发场景较边缘:已建立TCP连接后,路由表发生变化导致目标网络不可达,此时recv/send尝试操作数据包时会触发该错误。这类场景在常规TCP连接生命周期中不常见,因此手册未专门针对已连接socket的情况补充说明,但从内核实现逻辑来看,IP层无法找到路由时,会将该错误反馈给上层TCP socket操作。

内容的提问来源于stack exchange,提问作者Emil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 01:57:12