दिलचस्प पोस्ट
एआरएम: लिंक रजिस्टर और फ्रेम सूचक क्या स्थिर सदस्य कभी कचरा एकत्रित करते हैं? jquery $ (window) .height () दस्तावेज़ ऊंचाई वापस कर रहा है तारीखों के साथ matplotlib बार चार्ट कॉलबैक फ़ंक्शन में चर को बाँधें IDisposable के साथ Excel इंटरऑप ऑब्जेक्ट साफ़ करें वैध UUID / GUID का परीक्षण कैसे करें? जावा स्विंग JTextField सेट प्लेसहोल्डर किसी को भी कुछ अच्छा शब्द समझ विवाद सॉफ्टवेयर का पता है? मैं JavaScript में एक सरणी में "तर्क" ऑब्जेक्ट को कैसे परिवर्तित कर सकता / सकती हूं? चयनित पाठ का मूल तत्व प्राप्त करें 2 एरेज़ की तुलना करें जो अंतर को रिटर्न देता है एक समूह का उपयोग करके प्रत्येक समूह को मॉंगओडीबी में सीमित करके क्रमबद्ध करें लुआ टेबल में प्रविष्टियों की संख्या कैसे प्राप्त करें? यूनिक्स टाइमस्टैम्प को डेटटाइम कन्वर्ट और अजगर में इसे वापस परिवर्तित करें

मशीन का आईपी पता प्राप्त करें

यह सवाल लगभग समान है जैसा कि पहले से पूछा गया स्थानीय कंप्यूटर का आईपी पता – प्रश्न हालांकि मुझे लिनक्स मशीन के आईपी एड्रेस (एसएएस) को खोजने की जरूरत है I

इसलिए: मैं कैसे – प्रोग्रामेटिक रूप से सी ++ में – लिनक्स सर्वर के आईपी पते का पता लगाता हूं, मेरा एप्लीकेशन चालू हो रहा है। सर्वर में कम से कम दो आईपी पतों होंगे और मुझे एक विशेष (एक दिए गए नेटवर्क में एक (सार्वजनिक एक) की आवश्यकता होगी)।

मुझे यकीन है कि ऐसा करने के लिए एक सरल कार्य है – लेकिन कहां?


चीजों को थोड़ा साफ़ करने के लिए:

  • सर्वर स्पष्ट रूप से "स्थानीयहोस्ट" होगा: 127.0.0.1
  • सर्वर का आंतरिक (प्रबंधन) आईपी पता होगा: 172.16.xx
  • सर्वर के पास एक बाहरी (सार्वजनिक) आईपी पता होगा: 80.190.xx

मुझे अपने आवेदन को बाध्य करने के लिए बाहरी आईपी पते को खोजने की आवश्यकता है I जाहिर है मैं INADDR_ANY को भी बाध्य कर सकता हूं (और वास्तव में इस समय मैं क्या करता हूं)। मैं सार्वजनिक पते का पता लगाने के लिए पसंद करता हूं, यद्यपि।

Solutions Collecting From Web of "मशीन का आईपी पता प्राप्त करें"

मुझे ओएस एक्स (जो कि POSIX आज्ञाकारी है, लिनक्स के समान ही होना चाहिए) पर समस्याग्रस्त Iioctl समाधान पाया। हालांकि getifaddress () आपको आसानी से एक ही चीज़ करने देगा, यह ओएस एक्स 10.5 पर मेरे लिए ठीक काम करता है और नीचे समान होना चाहिए।

मैंने नीचे एक त्वरित उदाहरण दिया है जो मशीन के सभी आईपीवी 4 पते को प्रिंट करेगा, (आपको यह भी देखना चाहिए कि उत्तराधिकारी सफल यानी रिटर्न 0) है।

मैंने इसे अपडेट किया है IPv6 पते भी दिखाते हैं I

 #include <stdio.h> #include <sys/types.h> #include <ifaddrs.h> #include <netinet/in.h> #include <string.h> #include <arpa/inet.h> int main (int argc, const char * argv[]) { struct ifaddrs * ifAddrStruct=NULL; struct ifaddrs * ifa=NULL; void * tmpAddrPtr=NULL; getifaddrs(&ifAddrStruct); for (ifa = ifAddrStruct; ifa != NULL; ifa = ifa->ifa_next) { if (!ifa->ifa_addr) { continue; } if (ifa->ifa_addr->sa_family == AF_INET) { // check it is IP4 // is a valid IP4 Address tmpAddrPtr=&((struct sockaddr_in *)ifa->ifa_addr)->sin_addr; char addressBuffer[INET_ADDRSTRLEN]; inet_ntop(AF_INET, tmpAddrPtr, addressBuffer, INET_ADDRSTRLEN); printf("%s IP Address %s\n", ifa->ifa_name, addressBuffer); } else if (ifa->ifa_addr->sa_family == AF_INET6) { // check it is IP6 // is a valid IP6 Address tmpAddrPtr=&((struct sockaddr_in6 *)ifa->ifa_addr)->sin6_addr; char addressBuffer[INET6_ADDRSTRLEN]; inet_ntop(AF_INET6, tmpAddrPtr, addressBuffer, INET6_ADDRSTRLEN); printf("%s IP Address %s\n", ifa->ifa_name, addressBuffer); } } if (ifAddrStruct!=NULL) freeifaddrs(ifAddrStruct); return 0; } 
  1. एक सॉकेट बनाएं
  2. ioctl(<socketfd>, SIOCGIFCONF, (struct ifconf)&buffer);

ifconf और ifreq संरचनाओं के ifconf जानकारी के लिए /usr/include/linux/if.h पढ़ें यह आपको सिस्टम पर प्रत्येक इंटरफ़ेस का आईपी पता देना चाहिए। अतिरिक्त ioctls के लिए /usr/include/linux/sockios.h भी पढ़ें।

मुझे jjvainio का जवाब पसंद है जैसा कि ज़ान लाइनेक्स कहते हैं, यह ईथरनेट इंटरफ़ेस के आईपी पते को खोजने के लिए स्थानीय राउटिंग टेबल का उपयोग करता है जिसका उपयोग किसी विशिष्ट बाहरी होस्ट के लिए कनेक्शन के लिए किया जाएगा। कनेक्ट किए गए यूडीपी सॉकेट का उपयोग करके, आप वास्तव में कोई भी पैकेट भेजने के बिना जानकारी प्राप्त कर सकते हैं। दृष्टिकोण की आवश्यकता है कि आप एक विशिष्ट बाहरी होस्ट चुनते हैं। ज्यादातर समय, किसी भी प्रसिद्ध सार्वजनिक आईपी को चाल करना चाहिए। मुझे इस उद्देश्य के लिए Google के सार्वजनिक DNS सर्वर पता 8.8.8.8 पसंद है, लेकिन ऐसे समय हो सकते हैं, जब आप एक अलग बाहरी होस्ट आईपी चुनना चाहें। यहाँ कुछ कोड है जो संपूर्ण दृष्टिकोण को दर्शाता है

 void GetPrimaryIp(char* buffer, size_t buflen) { assert(buflen >= 16); int sock = socket(AF_INET, SOCK_DGRAM, 0); assert(sock != -1); const char* kGoogleDnsIp = "8.8.8.8"; uint16_t kDnsPort = 53; struct sockaddr_in serv; memset(&serv, 0, sizeof(serv)); serv.sin_family = AF_INET; serv.sin_addr.s_addr = inet_addr(kGoogleDnsIp); serv.sin_port = htons(kDnsPort); int err = connect(sock, (const sockaddr*) &serv, sizeof(serv)); assert(err != -1); sockaddr_in name; socklen_t namelen = sizeof(name); err = getsockname(sock, (sockaddr*) &name, &namelen); assert(err != -1); const char* p = inet_ntop(AF_INET, &name.sin_addr, buffer, buflen); assert(p); close(sock); } 

जैसा कि आपने पाया है कि एकल "स्थानीय आईपी पता" जैसी कोई चीज नहीं है। स्थानीय पते का पता लगाने का तरीका यहां बताया गया है जो विशिष्ट होस्ट पर भेजा जा सकता है।

  1. एक यूडीपी सॉकेट बनाएं
  2. सॉकेट को किसी बाहरी पते से कनेक्ट करें (आखिरकार स्थानीय पता प्राप्त करने वाला मेजबान)
  3. स्थानीय पता पाने के लिए वॉककैम का उपयोग करें

यूनिक्स के कई स्वादों पर काम करने का इसका लाभ है … और आप किसी भी ओ / एस पर काम करने के लिए इसे तुच्छ को संशोधित कर सकते हैं ऊपर दिए गए सभी समाधान मुझे कंपाइलर त्रुटियों को चाँद के चरण के आधार पर देते हैं। फिलहाल ऐसा करने के लिए एक अच्छा पॉसिक्स तरीका है … इसका इस्तेमाल न करें (उस वक्त यह लिखा गया था, ऐसा नहीं था)।

 // ifconfig | perl -ne 'print "$1\n" if /inet addr:([\d.]+)/' #include <stdlib.h> int main() { setenv("LANG","C",1); FILE * fp = popen("ifconfig", "r"); if (fp) { char *p=NULL, *e; size_t n; while ((getline(&p, &n, fp) > 0) && p) { if (p = strstr(p, "inet ")) { p+=5; if (p = strchr(p, ':')) { ++p; if (e = strchr(p, ' ')) { *e='\0'; printf("%s\n", p); } } } } } pclose(fp); return 0; } 

स्टीव बेकर ने क्या कहा है इसके अलावा, आप नेट डेविडिस (7) मैन पेज में SIOCGIFCONF ioctl का विवरण पा सकते हैं।

मेजबान पर आपके सभी आईपी पते की सूची के बाद, आपको उन पते को फ़िल्टर करने के लिए आवेदन विशिष्ट तर्क का उपयोग करना होगा जो आप नहीं चाहते हैं और आशा करते हैं कि आपके पास एक आईपी पता छोड़ा गया है।

कठोर कोड न करें: यह ऐसी चीज है जो बदल सकती है। कई प्रोग्राम एक config फ़ाइल में पढ़कर और जो कुछ भी कहते हैं, कर रहे हैं। इस तरह, भविष्य में कुछ समय के लिए अपने कार्यक्रम को किसी ऐसी चीज से बाँधना चाहिए जो सार्वजनिक आईपी नहीं है, ऐसा कर सकते हैं।

मुझे नहीं लगता कि आपके प्रश्न का एक निश्चित सही जवाब है। इसके बजाए आप क्या चाहते हैं, उसके करीब आने के तरीके का एक बड़ा बंडल है। इसलिए मैं कुछ संकेत देगा कि यह कैसे किया जाए।

यदि एक मशीन में 2 से अधिक इंटरफेस हैं ( lo एक के रूप में गिना जाता है) तो आपको आसानी से सही इंटरफ़ेस का पता लगाना होगा। यह कैसे करना है पर कुछ नुस्खे हैं

समस्या, उदाहरण के लिए, अगर होस्ट NAT फ़ायरवॉल के पीछे एक DMZ में हैं जो सार्वजनिक आईपी को कुछ निजी आईपी में बदलता है और अनुरोधों को आगे बढ़ाता है आपकी मशीन में 10 इंटरफेस हो सकते हैं, लेकिन केवल एक ही सार्वजनिक एक से मेल खाती है।

यहां तक ​​कि अगर आप डबल-एनएटी पर हैं, तब भी ऑटोटाइडेक्शन काम नहीं कर रहा है, जहां आपका फ़ायरवॉल स्रोत-आईपी को पूरी तरह से कुछ अलग कर देता है तो आप यह भी सुनिश्चित नहीं कर सकते हैं कि डिफ़ॉल्ट इंटरफ़ेस एक सार्वजनिक इंटरफ़ेस के साथ आपके इंटरफ़ेस की ओर जाता है।

इसे डिफ़ॉल्ट मार्ग के माध्यम से खोजें

यह मेरी ऑटोडेटेक्ट चीजों का अनुशंसित तरीका है

ip r get 1.1.1.1 तरह कुछ ip r get 1.1.1.1 आम तौर पर आपको इंटरफ़ेस बताता है जिसमें डिफ़ॉल्ट मार्ग है।

यदि आप इसे अपने पसंदीदा स्क्रिप्टिंग / प्रोग्रामिंग भाषा में पुन: बनाना चाहते हैं, तो strace ip r get 1.1.1.1 करें और पीले ईंट रोड का पालन करें।

इसे /etc/hosts साथ सेट करें

अगर आप नियंत्रण में रहना चाहते हैं तो यह मेरी सिफारिश है

आप /etc/hosts जैसे एक प्रविष्टि बना सकते हैं

 80.190.1.3 publicinterfaceip 

तब आप अपने सार्वजनिक इंटरफ़ेस का संदर्भ publicinterfaceip लिए इस उपनाम publicinterfaceip का उपयोग कर सकते हैं।

अफसोस की बात यह है कि आईपीवी 6 के साथ इस चाल में कोई haproxy नहीं है

पर्यावरण का उपयोग करें

यह /etc/hosts लिए एक अच्छा समाधान है यदि आप root नहीं हैं

/etc/hosts समान लेकिन इस के लिए पर्यावरण का उपयोग करें आप इस के लिए /etc/profile या ~/.profile कोशिश कर सकते हैं।

इसलिए यदि आपके कार्यक्रम में एक चर MYPUBLICIP आवश्यकता है तो आप कोड को शामिल कर सकते हैं (यह सी है, इसे से सी ++ बनाने के लिए स्वतंत्र महसूस करें):

 #define MYPUBLICIPENVVAR "MYPUBLICIP" const char *mypublicip = getenv(MYPUBLICIPENVVAR); if (!mypublicip) { fprintf(stderr, "please set environment variable %s\n", MYPUBLICIPENVVAR); exit(3); } 

तो आप अपनी स्क्रिप्ट / प्रोग्राम /path/to/your/script को इस तरह कॉल कर सकते हैं

MYPUBLICIP=80.190.1.3 /path/to/your/script

यह crontab में भी काम करता है

सभी इंटरफेस की गणना करें और उनको समाप्त करें जिन्हें आप नहीं चाहते हैं

अगर आप ip उपयोग नहीं कर सकते तो हताश तरीके

यदि आप जानना चाहते हैं कि आप क्या नहीं चाहते हैं, तो आप सभी इंटरफेस की गणना कर सकते हैं और सभी झूठे लोगों को अनदेखा कर सकते हैं।

इस दृष्टिकोण के लिए यहां पहले से ही एक जवाब https://stackoverflow.com/a/265978/490291 लगता है।

क्या इसे DLNA पसंद है?

शराबी आदमी का रास्ता जो खुद को शराब में डुबोने की कोशिश करता है

आप अपने नेटवर्क पर सभी यूपीएनपी गेटवे की गणना करने की कोशिश कर सकते हैं और इस तरह से कुछ "बाह्य" चीज़ों के लिए उचित मार्ग पता लगा सकते हैं। यह एक ऐसे मार्ग पर भी हो सकता है जहां आपका डिफ़ॉल्ट मार्ग इंगित नहीं करता।

इसके बारे में अधिक जानने के लिए https://en.wikipedia.org/wiki/Internet_Gateway_Device_Protocol

यह आपको अच्छी छाप देता है जो एक आपका असली सार्वजनिक इंटरफ़ेस है, भले ही आपका डिफ़ॉल्ट मार्ग कहीं और न हो।

वहाँ भी अधिक हैं

जहां पर्वत नबी से मिलता है

IPv6 राउटर आपको सही आईपीवी 6 उपसर्ग देने के लिए खुद को विज्ञापित करते हैं। उपसर्ग को देखते हुए आपको यह संकेत मिलता है कि उसके पास कुछ आंतरिक आईपी या वैश्विक स्तर है

आप कुछ उपयुक्त गेटवे को खोजने के लिए आईजीएमपी या आईबीजीपी फ्रेम के लिए सुन सकते हैं।

इसमें 2 से कम 32 आईपी पते हैं इसलिए यह लैन पर लंबे समय तक नहीं ले जाता है, बस उन सभी को पिंग कर रहा है। यह आपको एक सांख्यिकीय संकेत देता है जहां अधिकांश इंटरनेट आपके दृष्टिकोण से स्थित है। हालांकि आपको प्रसिद्ध https://de.wikipedia.org/wiki/SQL_Slammer से थोड़ी अधिक समझदार होना चाहिए

आईसीएमपी और यहां तक ​​कि एआरपी नेटवर्क साइडबैंड जानकारी के लिए अच्छे स्रोत हैं I यह आपकी मदद कर सकता है

आप अपने सभी नेटवर्क इन्फ्रास्ट्रक्चर उपकरणों से संपर्क करने के लिए ईथरनेट ब्रॉडकास्ट पता का उपयोग कर सकते हैं, जो अक्सर डीएचसीपी (यहां तक ​​कि डीएचसीपीवी 6) जैसी और भी मदद करते हैं।

यह अतिरिक्त सूची शायद अंतहीन और हमेशा अधूरी है, क्योंकि नेटवर्क उपकरणों के हर निर्माता ने अपने स्वयं के डिवाइसों को स्वत: पता लगाने के लिए नए सुरक्षा छिद्र की खोज शुरू कर दी है। कौन सा अक्सर कुछ सार्वजनिक इंटरफ़ेस का पता लगाने के लिए कितना मदद करता है जहां कोई भी नहीं हो सकता

'निफ ने कहा। बाहर।

आप कर्ल के साथ कुछ एकीकरण कर सकते हैं जितना आसान है: शेल से curl www.whatismyip.org आपको अपनी वैश्विक आईपी मिलेगा। आप कुछ बाहरी सर्वर पर निर्भर हैं, लेकिन यदि आप NAT के पीछे हैं तो आप हमेशा रहेंगे

जैसा कि सवाल लिनक्स को निर्दिष्ट करता है, एक मशीन के आईपी-पते की खोज के लिए मेरी पसंदीदा तकनीक है कि नेटलिंक का इस्तेमाल किया जाए। प्रोटोकॉल NETLINK_ROUTE की नेटलिंक सॉकेट बनाकर, और RTM_GETADDR भेजकर, आपके एप्लिकेशन को सभी उपलब्ध आईपी पते वाले संदेश प्राप्त होंगे। यहां एक उदाहरण दिया गया है ।

संदेश संभालने के कुछ हिस्सों के लिए, libmnl सुविधाजनक है यदि आप एनआईटीएक्स_ओआरयूटीई (और वे कैसे पार्स किए जाते हैं) के विभिन्न विकल्पों के बारे में ज्यादा जानने में क्यूरीज़ हैं, तो सबसे अच्छा स्रोत आईपीआरयूटीई 2 (विशेषकर मॉनिटर एप्लीकेशन) के स्रोत कोड के साथ-साथ कर्नेल में प्राप्त कार्य भी होता है। Rtnetlink के मैन पेज में उपयोगी जानकारी भी है।

लिनक्स के लिए एक सुरुचिपूर्ण पटकथा समाधान पाया जा सकता है: http://www.damnsmalllinux.org/f/topic-3-23-17031-0.html

// Use a HTTP request to a well known server that echo's back the public IP address void GetPublicIP(CString & csIP) { // Initialize COM bool bInit = false; if (SUCCEEDED(CoInitialize(NULL))) { // COM was initialized bInit = true;

  // Create a HTTP request object MSXML2::IXMLHTTPRequestPtr HTTPRequest; HRESULT hr = HTTPRequest.CreateInstance("MSXML2.XMLHTTP"); if (SUCCEEDED(hr)) { // Build a request to a web site that returns the public IP address VARIANT Async; Async.vt = VT_BOOL; Async.boolVal = VARIANT_FALSE; CComBSTR ccbRequest = L"http://whatismyipaddress.com/"; // Open the request if (SUCCEEDED(HTTPRequest->raw_open(L"GET",ccbRequest,Async))) { // Send the request if (SUCCEEDED(HTTPRequest->raw_send())) { // Get the response CString csRequest = HTTPRequest->GetresponseText(); // Parse the IP address CString csMarker = "<!-- contact us before using a script to get your IP address -->"; int iPos = csRequest.Find(csMarker); if (iPos == -1) return; iPos += csMarker.GetLength(); int iPos2 = csRequest.Find(csMarker,iPos); if (iPos2 == -1) return; // Build the IP address int nCount = iPos2 - iPos; csIP = csRequest.Mid(iPos,nCount); } } } } // Unitialize COM if (bInit) CoUninitialize(); 

}