मुझे सी भाषा का उपयोग करके अपने स्थानीय कंप्यूटर से सभी आईपी पते प्रदर्शित करने की आवश्यकता है। यह कैसे किया जा सकता है?मैं अपने होस्ट के आईपी पते को सी प्रोग्राम से कैसे आउटपुट करूं?
उत्तर
#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;
}
डिफ़ॉल्ट गेटवे के आईपी पते के साथ सभी आईपी पतों की तुलना करने के अलावा, इंटरनेट कनेक्शन के लिए कौन सा इंटरफ़ेस "डिफ़ॉल्ट" है, यह जानने का सबसे अच्छा तरीका क्या है? – daisy
@ warl0ck सामान्य मामले में करना मुश्किल हो सकता है। आपका खुद का एक अलग स्टैक ओवरफ़्लो प्रश्न के रूप में दिलचस्प होगा। –
यह आईपीवी 6 पते – drizzt
अभी तक कोई पूरा समाधान नहीं है, लेकिन /proc/net
पर एक नज़र डालें! नाम से
dev
सूची उपलब्ध इंटरफ़ेस डिवाइस,route
सूचियों कुछ मार्गों, के रूप मेंipv6_route
करता है, वास्तविक अनुमार्गण तालिका मेंarp
सूचियों उपकरणों (स्थानीय होस्ट शामिल नहीं है)।
अन्य समाधान के रूप में उच्च तकनीक के रूप में नहीं, लेकिन यह सरल फ़ाइल पढ़ने के साथ किया जा सकता है। लिनक्स विशिष्ट, यद्यपि।
#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;
}
पर्ल लिखने के लिए सी का उपयोग करना ... यही कारण है कि उम है .. धोखाधड़ी: पी। और पूरी तरह से अप्राप्य। – Macha
-1 एक उच्च भाषा और अन्य उपयोगिता के आसपास एक रैपर होने के लिए –
@ माचा कौन सा लिनक्स वितरण पर्ल के साथ नहीं भेजता है? मैंने एक ऑल-सी जवाब भी दिया। स्वीकृत उत्तर की तुलना में अधिक सुसंगतता और रखरखाव के लिए http://blog.stackoverflow.com/2010/01/stack-overflow-where-we-hate-fun/ –
कैसे के बारे में तो आप बस धोखा और /sbin/ifconfig/
के स्रोत को देखने? कुछ भी नहीं है अन्य दिग्गजों के कंधों पर खड़े के साथ गलत ...
क्षमा करें! ऐसा लगता है कि यह टिप्पणी को हटा नहीं गया है उत्तर कोड को चेक करें ... – user2284570
$ 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);
-1 सी कोड में खोल कमांड का उपयोग करने के लिए। आईएमओ को सलाह नहीं दी जानी चाहिए। वास्तविक भाषा और सिस्टम/लाइब्रेरी कॉल का उपयोग कर एक समाधान बहुत बेहतर है। विशेष रूप से इस तरह के एक शुरुआती सवाल के लिए। –
आप POSIX समारोह getaddrinfo()
की जरूरत है - यह सब IP पतों की सूची जुड़ा हुआ रिटर्न।
विवरण और उदाहरणों के लिए man getaddrinfo
देखें।
आपका प्रश्न अनिश्चित हो सकता है, लेकिन मुझे यकीन है कि क्यों हर कोई अपने चॉप टूट रहा है नहीं कर रहा हूँ।
मुझे लगता है कि आप मूल बातें पूछ रहे हैं, जिस स्थिति में आप शायद getifaddrs चाहते हैं। मैन पेज का एक छोटा सा उदाहरण प्रोग्राम है।
आप ioctl() के साथ SIOCGIFCONF विकल्प का उपयोग कर समान जानकारी भी प्राप्त कर सकते हैं। here और वेब पर कुछ नमूना कोड है।
यदि आप इन और इसी तरह के शब्दों के लिए चारों ओर खोज करते हैं तो आप पाएंगे कि यह प्रश्न पहले विभिन्न रूपों में पूछा गया है। आपको थोड़ा सा खोदना है।
यह भी ध्यान दें, यदि आप एनएटी के पीछे हैं तो ये आपको अपने नेटवर्क का सार्वजनिक सामना करने वाला आईपी नहीं देंगे।
सी में ऐसा करने का एक और तरीका मुझे यद्यपि कहना है .... खोल से ऐसा करने के कई तरीके हैं, क्या बात है?
#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;
}
के लिए काम नहीं करता है एक शेल स्पॉइंग एक साझा पुस्तकालय के अंदर कई वातावरणों में एक विकल्प नहीं है। यदि आप कांटा + निष्पादन करते हैं तो आप उस प्रक्रिया के लिए अचूक हैंडलर का कारण बन सकते हैं जो आपकी लाइब्रेरी को चलाने के लिए जुड़ा हुआ है, जो विनाशकारी हो सकता है। इसके अलावा आप कैसे सोचते हैं कि उन खोल उपयोगिताओं को लागू किया गया है? वे सी में लागू किए गए हैं – cmccabe
- 1. होस्ट नाम को आईपी पते
- 2. मैं प्रोग्राम के कंप्यूटर के स्थानीय नेटवर्क आईपी पते को कैसे प्राप्त करूं? (सी #)
- 3. अपने आईपी पते
- 4. आईपी पते से होस्ट नाम प्राप्त करें
- 5. मैं अपने सार्वजनिक आईपी पते को शेल स्क्रिप्ट में कैसे प्राप्त करूं?
- 6. आईपी पते के आधार पर होस्ट नाम कैसे प्राप्त करें?
- 7. यदि मैं एकाधिक आईपी पते वाले HTTP_X_FORWARDED_FOR से सही आईपी कैसे प्राप्त करूं?
- 8. कैसे आईपी पते
- 9. सी # में, मैं मेजबान के आईपी पते को कैसे हल करूं?
- 10. आईपी पते
- 11. विभाजन गलती जब होस्ट नाम और आईपी पते को देख
- 12. कैसे अपने सर्वर आईपी पते के लिए अपने डोमेन नाम संलग्न करने के लिए (अपाचे)
- 13. आईपी पते
- 14. अजगर - जाओ स्थानीय होस्ट आईपी
- 15. आईपी पते
- 16. Dns.GetHostEntry एकाधिक आईपी पते
- 17. पावरशेल: केवल आईपी पते
- 18. फ़ायरफ़ॉक्स में आईपी पते तक पहुंचने पर होस्ट हेडर भेजें
- 19. एसएस होस्ट होस्ट सत्यापन को 2 अलग-अलग होस्टों के साथ समान (लेकिन बदलते हुए) आईपी पते पर कैसे संभालें?
- 20. आईपी पते का पोर्ट नंबर कैसे खोजें?
- 21. एकाधिक आईपी पते
- 22. क्या दोनों आईपी पते
- 23. किसी भी आईपी पते
- 24. MongoDB स्थानीय होस्ट से कनेक्ट नहीं कर सकता है, लेकिन स्थानीय होस्ट के आईपी पते से कनेक्ट कर सकते
- 25. एक अलग आईपी पते
- 26. मैं कंसोल प्रोग्राम के आउटपुट को थ्रेड सुरक्षित तरीके से टेक्स्ट बॉक्स में रीडायरेक्ट कैसे करूं?
- 27. आर के भीतर से अपने आईपी पते को पुनः प्राप्त करने के लिए फंक्शन?
- 28. आईपी पते के अंदर स्थान
- 29. स्थिर आईपी पते
- 30. टोमकैट: निर्दिष्ट आईपी पते
'डालता है (" 127.0.0.1 "); बस मजाक कर रहा है :) – pmg
कौन से आईपी पते? कंप्यूटर को आईपी पते असाइन किया गया है? आपके नेटवर्क पर आईपी पते? इसके अलावा, आप किस मंच पर काम कर रहे हैं? सी भाषा स्वयं आईपी के बारे में कुछ भी नहीं जानता है। इसे ऑपरेटिंग सिस्टम कॉल करना होगा, और वे ऑपरेटिंग सिस्टम के बीच भिन्न हो सकते हैं। –
इसे "लिनक्स" –