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:如果需要绑定到特定接口,明确使用此选项

相关推荐
LXY_BUAA12 分钟前
《ubuntu22.04》_新系统的配置_20260418
linux·运维·服务器
楼田莉子16 分钟前
同步/异步日志系统:日志落地模块\日志器模块\异步日志模块
linux·服务器·c++·学习·设计模式
洛水水1 小时前
图解式讲解内存池:告别内存碎片与随机coredump
linux·内存池
NightReader1 小时前
SSH Client推荐集
运维·ssh
小章UPUP2 小时前
2025-2026 新FFmpeg GUI工具推荐
linux
探索宇宙真理.3 小时前
Nginx UI MCP接口绕过认证漏洞 | CVE-2026-33032复现&研究
运维·经验分享·网络安全·nginx-ui
llm大模型算法工程师weng3 小时前
负载均衡做什么?nginx是什么
运维·开发语言·nginx·负载均衡
byoass3 小时前
企业云盘私有化部署:存储架构设计与安全运维全流程实战
运维·网络·安全·云计算
fTiN CAPA3 小时前
服务器无故nginx异常关闭之kauditd0 kswapd0挖矿病毒 CPU占用200% 内存耗尽
运维·服务器·nginx
北山有鸟4 小时前
相机的水平消隐与垂直消隐
linux·驱动开发·相机