Linux: socket创建之后 interface down 然后再up起来

linux如果一个raw socket 创建起来,然后手动down掉这个interface,然后接下来在up起来之后,socket发送数据会是什么错误?

错误类型概述

在 Linux 中,当 raw socket 创建后,手动将其关联的网络接口 down 掉再 up 起来,发送数据时最常见的错误是 ENETDOWN (网络不可用) 或 ENETUNREACH (网络不可达)。

详细行为说明

  1. ENETDOWN (错误代码 100)
    发生时机:接口仍处于 down 状态,或内核认为接口不可用时
    错误信息:Network is down
    原因:socket 尝试通过已关闭的接口发送数据
  2. ENETUNREACH (错误代码 101)
    发生时机:接口重新 up 起来后,但路由表未正确恢复时
    错误信息:Network is unreachable
    原因:虽然接口已启动,但缺少必要的路由信息
  3. 可能继续工作的情况
    如果满足以下条件,socket 可能仍然正常工作:

Raw socket 未显式绑定到特定接口

接口 up 后完全恢复了 IP 地址和路由配置

使用的是 unbound raw socket(依赖内核自动路由选择)

验证方法

c 复制代码
// 示例代码片段
ssize_t result = sendto(raw_sock, buffer, len, 0, 
                        (struct sockaddr*)&dest, sizeof(dest));
if (result < 0) {
    if (errno == ENETDOWN) {
        printf("Error: Network interface is down\n");
    } else if (errno == ENETUNREACH) {
        printf("Error: Network is unreachable\n");
    }
    perror("sendto");
}

最佳实践建议

监控接口状态:使用 netlink socket 监听接口状态变化

重新绑定:接口恢复后重新绑定 socket

错误处理:实现重试机制处理临时网络故障

使用 SO_BINDTODEVICE:如果需要绑定到特定接口,明确使用此选项

相关推荐
heimeiyingwang2 小时前
向量数据库VS关系数据库VS非关系数据库
运维·人工智能·重构·架构·机器人
之歆2 小时前
Linux 软件包管理与编译安装
linux·运维·服务器
Linux运维技术栈2 小时前
实战运维|CentOS7 Nexus3.21.1 迁移至 Rocky Linux9.5 + 升级至3.68.1
运维·nexus3
廋到被风吹走2 小时前
DDD领域驱动设计深度解析:从理论到代码实践
java·大数据·linux
麦德泽特2 小时前
OpenWrt在机器人中的高级网络应用:AP+STA模式、中继与防火墙配置实战
运维·网络·机器人
这儿有一堆花2 小时前
Linux 软件包管理:从源码编译到现代自动化运维
linux·运维·自动化
范什么特西2 小时前
狂神--守护线程
java·linux·服务器
github.com/starRTC2 小时前
Claude Code中英文系列教程32:Claude Code官方推荐的MCP 服务器
运维·服务器
德迅云安全_初启2 小时前
2026年十大危险DNS攻击类型及预防措施
linux·服务器·网络