2010-01-07 15 views
14

मुझे सी भाषा का उपयोग करके अपने स्थानीय कंप्यूटर से सभी आईपी पते प्रदर्शित करने की आवश्यकता है। यह कैसे किया जा सकता है?मैं अपने होस्ट के आईपी पते को सी प्रोग्राम से कैसे आउटपुट करूं?

+15

'डालता है (" 127.0.0.1 "); बस मजाक कर रहा है :) – pmg

+2

कौन से आईपी पते? कंप्यूटर को आईपी पते असाइन किया गया है? आपके नेटवर्क पर आईपी पते? इसके अलावा, आप किस मंच पर काम कर रहे हैं? सी भाषा स्वयं आईपी के बारे में कुछ भी नहीं जानता है। इसे ऑपरेटिंग सिस्टम कॉल करना होगा, और वे ऑपरेटिंग सिस्टम के बीच भिन्न हो सकते हैं। –

+6

इसे "लिनक्स" –

उत्तर

13
#include <stdio.h> 
#include <stropts.h> 
#include <sys/socket.h> 
#include <sys/ioctl.h> 
#include <linux/netdevice.h> 
#include <arpa/inet.h> 
#include <netinet/in.h> 
#include <unistd.h> 

int print_addresses(const int domain) 
{ 
    int s; 
    struct ifconf ifconf; 
    struct ifreq ifr[50]; 
    int ifs; 
    int i; 

    s = socket(domain, SOCK_STREAM, 0); 
    if (s < 0) { 
    perror("socket"); 
    return 0; 
    } 

    ifconf.ifc_buf = (char *) ifr; 
    ifconf.ifc_len = sizeof ifr; 

    if (ioctl(s, SIOCGIFCONF, &ifconf) == -1) { 
    perror("ioctl"); 
    return 0; 
    } 

    ifs = ifconf.ifc_len/sizeof(ifr[0]); 
    printf("interfaces = %d:\n", ifs); 
    for (i = 0; i < ifs; i++) { 
    char ip[INET_ADDRSTRLEN]; 
    struct sockaddr_in *s_in = (struct sockaddr_in *) &ifr[i].ifr_addr; 

    if (!inet_ntop(domain, &s_in->sin_addr, ip, sizeof(ip))) { 
     perror("inet_ntop"); 
     return 0; 
    } 

    printf("%s - %s\n", ifr[i].ifr_name, ip); 
    } 

    close(s); 

    return 1; 
} 

int main(int argc, char *argv[]) 
{ 
    int domains[] = { AF_INET, AF_INET6 }; 
    int i; 

    for (i = 0; i < sizeof(domains)/sizeof(domains[0]); i++) 
    if (!print_addresses(domains[i])) 
     return 1; 

    return 0; 
} 
+0

डिफ़ॉल्ट गेटवे के आईपी पते के साथ सभी आईपी पतों की तुलना करने के अलावा, इंटरनेट कनेक्शन के लिए कौन सा इंटरफ़ेस "डिफ़ॉल्ट" है, यह जानने का सबसे अच्छा तरीका क्या है? – daisy

+0

@ warl0ck सामान्य मामले में करना मुश्किल हो सकता है। आपका खुद का एक अलग स्टैक ओवरफ़्लो प्रश्न के रूप में दिलचस्प होगा। –

+2

यह आईपीवी 6 पते – drizzt

3

अभी तक कोई पूरा समाधान नहीं है, लेकिन /proc/net पर एक नज़र डालें! नाम से

  • dev सूची उपलब्ध इंटरफ़ेस डिवाइस,
  • route सूचियों कुछ मार्गों, के रूप में ipv6_route करता है, वास्तविक अनुमार्गण तालिका में
  • arp सूचियों उपकरणों (स्थानीय होस्ट शामिल नहीं है)।

अन्य समाधान के रूप में उच्च तकनीक के रूप में नहीं, लेकिन यह सरल फ़ाइल पढ़ने के साथ किया जा सकता है। लिनक्स विशिष्ट, यद्यपि।

-3
#include <stdio.h> 
#include <stdlib.h> 
#include <sys/wait.h> 

/* 
* Who sez? 
* http://blog.stackoverflow.com/2010/01/stack-overflow-where-we-hate-fun/ 
*/ 
int main(int argc, char *argv[]) 
{ 
    int status; 
    const char * const cmd = /* die from END is too chatty */ 
    "/sbin/ifconfig -a | \ 
    perl -lne \ 
     'print $1 if /inet6? addr:\\s*(\\S+)/; \ 
     END { $. > 0 or \ 
       warn(\"no output from ifconfig\\n\"), \ 
       exit 1; }'"; 

    status = system(cmd); 
    if (status < 0) { 
    perror("system"); 
    return 1; 
    } 
    else if (status != 0) { 
    const char *extra; 
    status = WEXITSTATUS(status); 
    extra = status == 127 ? " (is /bin/sh ok?)" : ""; 
    fprintf(stderr, "%s: command failed with status %d%s\n", 
      argv[0], status, extra); 
    } 

    return 0; 
} 
+2

पर्ल लिखने के लिए सी का उपयोग करना ... यही कारण है कि उम है .. धोखाधड़ी: पी। और पूरी तरह से अप्राप्य। – Macha

+3

-1 एक उच्च भाषा और अन्य उपयोगिता के आसपास एक रैपर होने के लिए –

+0

@ माचा कौन सा लिनक्स वितरण पर्ल के साथ नहीं भेजता है? मैंने एक ऑल-सी जवाब भी दिया। स्वीकृत उत्तर की तुलना में अधिक सुसंगतता और रखरखाव के लिए http://blog.stackoverflow.com/2010/01/stack-overflow-where-we-hate-fun/ –

4

कैसे के बारे में तो आप बस धोखा और /sbin/ifconfig/ के स्रोत को देखने? कुछ भी नहीं है अन्य दिग्गजों के कंधों पर खड़े के साथ गलत ...

+0

क्षमा करें! ऐसा लगता है कि यह टिप्पणी को हटा नहीं गया है उत्तर कोड को चेक करें ... – user2284570

-2
 
$ sudo ifconfig | grep 'inet addr' | cut -d':' -f2 | cut -d' ' -f1 
213.xx.xxx.xx 
192.168.xx.x 
127.0.0.1 

और तुम रख सकते हैं कि popen() में:

/* not tested */ 
ph = popen("sudo ifconfig | grep 'inet addr' | cut -d':' -f2 | cut -d' ' -f1", "r"); 
while (fgets(buf, sizeof buf, ph)) { 
    /* ip address, in nul-terminated string format, is in `buf` */ 
} 
pclose(ph); 
+2

-1 सी कोड में खोल कमांड का उपयोग करने के लिए। आईएमओ को सलाह नहीं दी जानी चाहिए। वास्तविक भाषा और सिस्टम/लाइब्रेरी कॉल का उपयोग कर एक समाधान बहुत बेहतर है। विशेष रूप से इस तरह के एक शुरुआती सवाल के लिए। –

2

आप POSIX समारोह getaddrinfo() की जरूरत है - यह सब IP पतों की सूची जुड़ा हुआ रिटर्न।

विवरण और उदाहरणों के लिए man getaddrinfo देखें।

9

आपका प्रश्न अनिश्चित हो सकता है, लेकिन मुझे यकीन है कि क्यों हर कोई अपने चॉप टूट रहा है नहीं कर रहा हूँ।

मुझे लगता है कि आप मूल बातें पूछ रहे हैं, जिस स्थिति में आप शायद getifaddrs चाहते हैं। मैन पेज का एक छोटा सा उदाहरण प्रोग्राम है।

आप ioctl() के साथ SIOCGIFCONF विकल्प का उपयोग कर समान जानकारी भी प्राप्त कर सकते हैं। here और वेब पर कुछ नमूना कोड है।

यदि आप इन और इसी तरह के शब्दों के लिए चारों ओर खोज करते हैं तो आप पाएंगे कि यह प्रश्न पहले विभिन्न रूपों में पूछा गया है। आपको थोड़ा सा खोदना है।

यह भी ध्यान दें, यदि आप एनएटी के पीछे हैं तो ये आपको अपने नेटवर्क का सार्वजनिक सामना करने वाला आईपी नहीं देंगे।

7

सी में ऐसा करने का एक और तरीका मुझे यद्यपि कहना है .... खोल से ऐसा करने के कई तरीके हैं, क्या बात है?

#include <sys/types.h> 
#include <sys/socket.h> 
#include <arpa/inet.h> 
#include <net/if.h> 

#include <errno.h> 
#include <ifaddrs.h> 
#include <netinet/in.h> 
#include <stdio.h> 
#include <stdlib.h> 


void show_address_info(struct ifaddrs *ifa){ 
    struct sockaddr_in *s4; 
    struct sockaddr_in6 *s6; 
    /* ipv6 addresses have to fit in this buffer */ 
    char buf[64]; 

    if (AF_INET == ifa->ifa_addr->sa_family){ 
    s4 = (struct sockaddr_in *)(ifa->ifa_addr); 
    if (NULL == inet_ntop(ifa->ifa_addr->sa_family, (void *)&(s4->sin_addr), buf, sizeof(buf))){ 
     printf("%s: inet_ntop failed!\n", ifa->ifa_name); 
    } else { 
     printf("IPv4 addr %s: %s\n", ifa->ifa_name, buf); 
    } 
    } 
    else if (AF_INET6 == ifa->ifa_addr->sa_family) { 
    s6 = (struct sockaddr_in6 *)(ifa->ifa_addr); 
    if (NULL == inet_ntop(ifa->ifa_addr->sa_family, (void *)&(s6->sin6_addr), buf, sizeof(buf))) { 
     printf("%s: inet_ntop failed!\n", ifa->ifa_name); 
    } else { 
     printf("IPv6 addr %s: %s\n", ifa->ifa_name, buf); 
     } 
    } 

} 


int main(int argc, char **argv){ 
    struct ifaddrs *myaddrs, *ifa; 
    int status; 

    status = getifaddrs(&myaddrs); 
    if (status != 0){ 
    perror("getifaddrs failed!"); 
    exit(1); 
    } 

    for (ifa = myaddrs; ifa != NULL; ifa = ifa->ifa_next){ 
    if (NULL == ifa->ifa_addr){ 
     continue; 
    } 
    if ((ifa->ifa_flags & IFF_UP) == 0) { 
     continue; 
    } 
    show_address_info(ifa); 
    } 
    freeifaddrs(myaddrs); 
    return 0; 
} 
+0

के लिए काम नहीं करता है एक शेल स्पॉइंग एक साझा पुस्तकालय के अंदर कई वातावरणों में एक विकल्प नहीं है। यदि आप कांटा + निष्पादन करते हैं तो आप उस प्रक्रिया के लिए अचूक हैंडलर का कारण बन सकते हैं जो आपकी लाइब्रेरी को चलाने के लिए जुड़ा हुआ है, जो विनाशकारी हो सकता है। इसके अलावा आप कैसे सोचते हैं कि उन खोल उपयोगिताओं को लागू किया गया है? वे सी में लागू किए गए हैं – cmccabe

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