Как проверить, работает ли интерфейс

Название в значительной степени говорит обо всем. Если я бегу ifconfigЯ получаю это:

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
inet -snip-  netmask 255.255.255.0  broadcast -snip-
...

Используя это, я могу знать, если оно или нет (<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);
}

Кто-нибудь может указать мне правильное направление для этого?

7

Решение

Ответ был прост: я использовал побитовое ИЛИ (|) вместо оператора AND (&) оператор. Фиксированный код:

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);
}
16

Другие решения

Если вы заботитесь о состоянии вверх / вниз интерфейса, вы можете использовать флаг «IFF_RUNNING» вместо флага «IFF_UP», предоставленного текущим ответом.

4

Рассматривали ли вы использование strace Команда, чтобы увидеть, как ifconfig работает? Вы даже можете увидеть, какие параметры передаются в функции и другие интересные детали того, как ifconfig работает ..

3
По вопросам рекламы [email protected]