我执行了一个简单的测试:
ifdown eth1
ifup eth1
然后我尝试以下列方式获取eth1接口标志:
struct ifreq flags_s;
int result = 0;
int sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);
(void)strcpy(flags_s.ifr_name, "eth1");
flags_s.ifr_flags = 0;
result = ioctl(sockfd, SIOCGIFFLAGS, &flags_s);
if (-1 == result)
{
perror("ioctl");
close(sockfd);
}
if (flags_s.ifr_flags & IFF_UP)
{
fprintf(stderr, "IFF_UPP+\n");
}
if (flags_s.ifr_flags & IFF_RUNNING)
{
fprintf(stderr, "IFF_RUNNING+\n");
}
在所有情况下,我只看到IFF_UP标志而没有IFF_RUNNING。有人可以解释为什么flags_s.ifr_flags不包含IFF_RUNNING标志?
这是我的netstat -i
输出,我们可以看到为eth1设置了标志RUNNING:
Kernel Interface table
Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg
eth0 1500 0 45387749 0 19798101 0 2572141 0 0 0 BMRU
eth1 1500 0 111 0 10484579 0 26 0 0 0 BMRU
同样在ifconfig
输出中:UP BROADCAST RUNNING MULTICAST
我有一个使用netlink,rtnetlink的接口监督功能的遗留代码。当接口启动时,程序检查IFF_UP和IFF_RUNNING标志。由于上述问题,此功能无法正常工作。