相关疑难解决方法(0)

如何检查界面是否已启动

标题几乎说明了一切.如果我跑ifconfig,我得到这个:

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
    inet -snip-  netmask 255.255.255.0  broadcast -snip-
    ...
Run Code Online (Sandbox Code Playgroud)

使用它,我可以知道它是否已启动(<UP,...),但我希望能够在C(或C++,如果有更简单的解决方案)中执行此操作,而不依赖于解析外部进程.


这是我到目前为止所做的(不起作用):

bool is_interface_online(std::string interface) {
    struct ifreq ifr;
    int sock = socket(PF_INET6, SOCK_DGRAM, IPPROTO_IP);
    memset(&ifr, 0, sizeof(ifr));
    strcpy(ifr.ifr_name, interface.c_str());
    if (ioctl(sock, SIOCGIFFLAGS, &ifr) < 0) {
            perror("SIOCGIFFLAGS");
    }
    close(sock);
    return !!(ifr.ifr_flags | IFF_UP);
}
Run Code Online (Sandbox Code Playgroud)

任何人都能指出我正确的方向吗?

c++ linux ioctl

7
推荐指数
2
解决办法
1万
查看次数

如何在 Linux 中异步检查 ipv6 网络接口状态是否从暂定更改为“有效”?

IPv6地址分配前后会经历各种状态,例如临时地址、重复地址和首选地址。这些地址状态适用于手动和自动配置的地址。我遇到一种情况,当在暂定状态下使用网络接口时,对一天中的时间服务器的请求无限期地阻塞。(当从 python 脚本中调用 rdate 实用程序时)。通过实验,我得出结论,在接口处于暂定状态时调用 rdate 是问题所在。

我看到

ip-monitor
Run Code Online (Sandbox Code Playgroud)

可以使用命令,并 在 Linux 上的 AF_NETLINK 套接字中找到一些有趣的想法:如何以编程方式确定 NIC 接口是否已启用并插入?

我正在尝试设置一些异步调用(最好在 python3 中),一旦接口准备好并且 rdate 可以恢复,该调用就会返回。netlink 套接字似乎就是解决这个问题的工具。读完这篇文章和 netlink(7) 我发现我需要类似的东西

s = socket(AF_NETLINK, SOCK_DGRAM, NETLINK_ROUTE);
Run Code Online (Sandbox Code Playgroud)

但我无法找到有关从套接字获取输出后要检查哪些结构字段/设备标志的正确信息。在 netdevice(7) 中我发现

IFF_UP            Interface is running.
Run Code Online (Sandbox Code Playgroud)

但我不确定在暂定状态下这是否也是如此。

当然,最简单的方法就是循环 sleep 并检查

ip a show dev devName
Run Code Online (Sandbox Code Playgroud)

直到状态有效,但我将其保留为最后的手段,以防异步调用失败。

sockets linux linux-kernel netlink

1
推荐指数
1
解决办法
1349
查看次数

标签 统计

linux ×2

c++ ×1

ioctl ×1

linux-kernel ×1

netlink ×1

sockets ×1