2013-03-30 64 views
6

標題幾乎說明了一切。如果我運行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); 
} 

任何人都可以點我在這個正確的方向是什麼?

+2

的ifconfig是開源的BTW – Slava

回答

12

答案很簡單:我用位運算符(|)而不是運算符(&)。固定的代碼是:

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

你有使用strace命令怎麼看ifconfig作品考慮?你甚至可以看到參數傳遞給函數,以及如何ifconfig作品的其他有趣的細節..

+2

是的,我的,其實,這是我以前寫的函數:d – MiJyn

2

如果你關心界面的向上/向下狀態則可能需要使用「IFF_RUNNING」標誌,而不是「由當前的答案提供IFF_UP」標誌。