2013-03-30 5 views
6

제목은 거의 모든 것을 말합니다. 이 위 또는하지 (<UP,...을)의 경우이 사용인터페이스가 작동하는지 확인하는 방법

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

, 내가 알 수 있습니다,하지만 난이있는 경우, ++ C (또는 C에서이 작업을 수행 할 수 있도록하려면 : 나는 ifconfig을 실행하면,이 얻을 더 간단한 해결책)을 제공합니다.

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

사람이에 대한 올바른 방향으로 날 지점 수 : 여기


는 지금까지 (작동하지 않습니다)있어 무엇인가?

+2

ifconfig가 오픈 소스입니다. btw – Slava

답변

12

대답은 간단합니다 : AND (&) 연산자 대신 비트 OR (|) 연산자를 사용했습니다. 고정 코드는 다음과 같습니다

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); 
} 
+1

Fedora 18 시스템에서도 테스트를 마쳤습니다. –

3

가 어떻게 ifconfig 작품을 볼 수 strace 명령을 사용하여 생각 해 봤나? 함수에 전달되는 매개 변수와 다른 흥미로운 세부 정보를 볼 수 있습니다.

+2

예 사실 저는 이것을 함수 작성에 사용했습니다 : D – MiJyn

2

인터페이스의 위/아래 상태에 관심이 있다면 "IFF_RUNNING"플래그 대신 " 현재 응답에서 제공하는 "IFF_UP"플래그입니다.

관련 문제