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

相关推荐
舒一笑1 天前
程序员效率神器:一文掌握 tmux(服务器开发必备工具)
运维·后端·程序员
Johny_Zhao1 天前
centos7安装部署openclaw
linux·人工智能·信息安全·云计算·yum源·系统运维·openclaw
haibindev1 天前
在 Windows+WSL2 上部署 OpenClaw AI员工的实践与踩坑
linux·wsl2·openclaw
NineData1 天前
数据库管理工具NineData,一年进化成为数万+开发者的首选数据库工具?
运维·数据结构·数据库
梦想很大很大2 天前
拒绝“盲猜式”调优:在 Go Gin 项目中落地 OpenTelemetry 链路追踪
运维·后端·go
Sinclair2 天前
内网服务器离线安装 Nginx+PHP+MySQL 的方法
运维
叶落阁主2 天前
Tailscale 完全指南:从入门到私有 DERP 部署
运维·安全·远程工作
0xDevNull3 天前
Linux切换JDK版本详细教程
linux
进击的丸子3 天前
虹软人脸服务器版SDK(Linux/ARM Pro)多线程调用及性能优化
linux·数据库·后端