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

相关推荐
阳光九叶草LXGZXJ3 小时前
达梦数据库-报错-15-列【XXX】长度超出定义
linux·运维·数据库·sql·学习
奔跑的大白啊4 小时前
多容器共享目录权限踩坑记
linux·ubuntu·共享目录·linux权限·docker 容器化部署
黄大刀5 小时前
DataPulse一款开箱即用的SCADA(四)-历史记录
运维·scada·动环
归秋1427 小时前
2026 企业 AI 办公工具选型指南:从评估框架到产品适配
大数据·运维·人工智能
Android系统攻城狮7 小时前
Linux Gstreamer深度解析之gst_audio_encoder_set_frame_max调用流程与实战(六十一)
android·linux·运维·音视频·gstreamer音视频·音视频进阶·gstreamer音视频进阶
H.莓飛7 小时前
【C++】命名空间、缺省参数、函数重载与引用
linux·开发语言·c++·visual studio
91刘仁德8 小时前
IP协议详解:从IP协议头到网段划分、路由与NAT
linux·服务器·网络·网络协议·tcp/ip
硅基手札8 小时前
【Linux内核专栏 14】网络协议栈
linux·运维·网络协议
沫璃染墨10 小时前
《Linux工程实践篇(一):认识设计模式——从日志系统看策略模式》
linux·c++·安全·设计模式·策略模式
工作10年+,存储芯片行业10 小时前
Linux NVMe 中断排查与性能优化:CPU 亲和性
linux·运维·服务器·windows·性能优化·ssd·pcie