我的UBUNTU机器有两个网络接口(interface)端口。我想用C / C++编写一个应用程序,在其中可以检测网络接口(interface)的更改并打印结果。
例如当连接了两根网络电缆时,应用程序应打印两个接口(interface)都打开。
当我拔下一根电缆时,应用程序应删除该接口(interface)的所有信息,并打印出哪个接口(interface)向上和向下。
最佳答案
您可以使用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 );
}
如果您想立即获得有关更改的信息,
然后从内核监听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));
}
..并根据需要接收和处理消息。
有一个库libnl使它更容易。