2013-03-30 5 views
6

शीर्षक बहुत कुछ कहता है।इंटरफ़ेस ऊपर है या नहीं, यह जांचने के लिए

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

इस का उपयोग करना, मैं अगर यह है या नहीं (<UP,...) है पता कर सकते हैं, लेकिन मैं अगर वहाँ एक सी (या सी में यह करने के लिए ++, सक्षम होना चाहते हैं: यदि मैं 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 ओपन सोर्स बीटीडब्ल्यू – 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

है मैंने इसे अपने फेडोरा 18 मशीन पर भी परीक्षण किया है, ठीक काम करता है। –

3

आप strace आदेश का उपयोग कैसे ifconfig काम करता है देखने के लिए विचार किया है? आप यह भी देख सकते हैं कि ifconfig कैसे काम करता है और अन्य रोचक विवरणों के लिए क्या पैरामीटर पारित किए जाते हैं ..

+2

हां, वास्तव में, मैं वही काम लिखता था: डी – MiJyn

2

यदि आप इंटरफ़ेस की अप/डाउन स्थिति की परवाह करते हैं तो आप "IFF_RUNNING" ध्वज का उपयोग " IFF_UP "वर्तमान उत्तर द्वारा प्रदान किया गया झंडा।

संबंधित मुद्दे

 संबंधित मुद्दे