检测网络接口变化

raj*_*raj 1 c c++ linux network-programming

我的 UBUNTU 机器有两个网络接口端口。我想用 C/C++ 编写一个应用程序,我可以在其中检测网络接口的变化并打印结果。

例如,当连接了两条网络电缆时,应用程序应该打印两个接口都已启动。当我拔下一根电缆时,应用程序应该删除该接口的所有信息并打印哪个接口关闭和打开。

SKi*_*SKi 6

您可以通过以下方式轮询链接状态ioctl()

struct ifreq ifr;

memset(&ifr, 0, sizeof(ifr));
strcpy(ifr.ifr_name, "eth0");

if (ioctl(fd, SIOCGIFFLAGS, &ifr) != -1)
{
    up_and_running = (ifr.ifr_flags & ( IFF_UP | IFF_RUNNING )) == ( IFF_UP | IFF_RUNNING );
}
Run Code Online (Sandbox Code Playgroud)

如果您想立即了解有关更改的信息,请收听来自内核的 netlink 消息。

请参见手册页PF_NETLINK(7)

创建用于获取链接事件的 AF_NETLINK 套接字:

const int netlink_fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
if (netlink_fd != -1)
{
    struct sockaddr_nl sa;

    memset(&sa, 0, sizeof(sa));
    sa.nl_family = AF_NETLINK;
    sa.nl_groups = RTNLGRP_LINK;
    bind(netlink_fd, (struct sockaddr*)&sa, sizeof(sa));
}
Run Code Online (Sandbox Code Playgroud)

..并根据需要接收和处理消息。

有一个库libnl可以使这更容易。