दिलचस्प पोस्ट
कैसे ताज़ा करने के बिना URL को फिर से लिखना, जैसे GitHub.com ब्राउज़र का बैक बटन अक्षम करें Matplotlib आंकड़े बनाने के बाद मैं कैसे स्मृति को रिलीज कर सकता हूं मैं आरजीएल का नवीनतम संस्करण कैसे स्थापित करूं? सीतनिद्रा में होना: कहाँ सम्मिलित करें = गलत, अद्यतन करने योग्य = गलत विदेशी कुंजी सम्मिलित समग्र कुंजी नक्षत्रों में हैं? एप्लिकेशन निष्क्रिय समय गिट अंतर में रेंज के लिए डबल डॉट ".. और ट्रिपल डॉट" … के बीच अंतर क्या हैं? बूटस्ट्रैप 3 में navbar तत्व के बाहर क्लिक करते समय एक खुला ढंका हुआ नवबार बंद कैसे करें? सी में डायनामिक बहुआयामी arrays के साथ मैं कैसे काम करूं? एंड्रॉइड स्टूडियो "प्रतीक को हल नहीं कर सकता" लेकिन प्रोजेक्ट संकलित करता है क्या पायथन में कई पंक्तियों में एक लंबी रेखा को तोड़ना संभव है NSFontAttributedString XCode 6.1 से पहले काम किया मैं अपने एंड्रॉइड ऐप से संसाधनों की एक निर्देशिका सूची कैसे प्राप्त करूं? उत्तर। एएसपी.नेट में किसी अन्य यूआरएल को डेटा पोस्ट करने के लिए रीडायरेक्ट करें AFNetworking और पृष्ठभूमि स्थानान्तरण

स्थानीय कंप्यूटर का आईपी पता प्राप्त करें

सी ++ में, स्थानीय कंप्यूटर का आईपी पता और सबनेट मुखौटा पाने का सबसे आसान तरीका क्या है?

मैं अपने स्थानीय नेटवर्क में स्थानीय मशीन का आईपी पता लगाने में सक्षम होना चाहता हूं। मेरे विशेष मामले में, मेरे पास 255.255.255.0 के एक सबनेट मुखौटा वाला नेटवर्क है और मेरे कंप्यूटर का आईपी पता 192.168.0.5 है। मेरे नेटवर्क में एक प्रसारण संदेश भेजने के लिए मुझे इन दोनों मानों को प्रोग्रामेटिक रूप से प्राप्त करने की ज़रूरत है (मेरे विशेष मामले के लिए, 1 9 02 .68.05 .55 के रूप में)

संपादित करें: बहुत से उत्तर मुझे अपेक्षित परिणाम नहीं दे रहे थे क्योंकि मेरे पास दो अलग नेटवर्क आईपी थे Torial का कोड चाल (यह मुझे दोनों आईपी पते दिया) था धन्यवाद।

2 संपादित करें: सबनेट मास्क के बारे में जानकारी के लिए ब्रायन आर। बॉडी के लिए धन्यवाद

Solutions Collecting From Web of "स्थानीय कंप्यूटर का आईपी पता प्राप्त करें"

सवाल यह प्रकट होता है जितना जटिल होता है, क्योंकि कई मामलों में "स्थानीय कंप्यूटर के लिए एक आईपी पता" नहीं है जो कि बहुत से भिन्न आईपी पते उदाहरण के लिए, मैक जिस पर मैं अभी टाइप कर रहा हूँ (जो कि एक बहुत ही बुनियादी, मानक मैक सेटअप है) में इसके साथ जुड़े निम्नलिखित आईपी पते हैं:

fe80::1%lo0 127.0.0.1 ::1 fe80::21f:5bff:fe3f:1b36%en1 10.0.0.138 172.16.175.1 192.168.27.1 

… और यह पता लगाने की बात नहीं है कि उपरोक्त में से कौन सा "असली आईपी पता है", या तो … वे सभी "वास्तविक" और उपयोगी हैं; आप के लिए पते का उपयोग करने जा रहे हैं पर निर्भर करते हुए दूसरों की तुलना में कुछ और अधिक उपयोगी होते हैं।

अपने अनुभव में अक्सर अपने स्थानीय कंप्यूटर के लिए "एक आईपी पता" प्राप्त करने का सबसे अच्छा तरीका स्थानीय कंप्यूटर को बिल्कुल भी पूछना नहीं है, बल्कि कंप्यूटर से पूछना है कि आपका प्रोग्राम उस बात से बात कर रहा है जो आपके कंप्यूटर के आईपी पते को देखता है। उदाहरण के लिए यदि आप एक क्लाइंट प्रोग्राम लिख रहे हैं, तो सर्वर से एक संदेश भेजें जिससे सर्वर को आईपी पते के रूप में वापस भेजने के लिए कहें जो आपके अनुरोध से आया था इस तरह आपको पता चल जाएगा कि प्रासंगिक आईपी ​​पता क्या है, कंप्यूटर के संदर्भ में आप किसके साथ संचार कर रहे हैं।

उसने कहा, यह चाल कुछ उद्देश्यों के लिए उपयुक्त नहीं हो सकता (उदाहरण के लिए जब आप किसी विशेष कंप्यूटर से बात नहीं कर रहे हों), तो कभी-कभी आपको अपने मशीन से जुड़े सभी आईपी पतों की सूची को इकट्ठा करना होगा। यूनिक्स / मैक (एएएआईआईएके) के तहत ऐसा करने का सबसे अच्छा तरीका है पाने वाले () और परिणाम विंडोज के अंतर्गत, समान कार्यक्षमता प्राप्त करने के लिए GetAdaptersAddresses () का प्रयास करें। उदाहरण के लिए दोनों के उपयोग, इस फ़ाइल में GetNetworkInterfaceInfos () फ़ंक्शन देखें।

Gethostbyname के आधार पर सभी तरीकों के साथ समस्या यह है कि आपको किसी विशेष मशीन को निर्दिष्ट किए गए सभी आईपी पते नहीं मिलेगा। सर्वर में आमतौर पर एक से अधिक एडॉप्टर होते हैं

यहां एक उदाहरण दिया गया है कि आप मेजबान मशीन पर सभी Ipv4 और Ipv6 पते के जरिए दोहरा सकते हैं:

 void ListIpAddresses(IpAddresses& ipAddrs) { IP_ADAPTER_ADDRESSES* adapter_addresses(NULL); IP_ADAPTER_ADDRESSES* adapter(NULL); // Start with a 16 KB buffer and resize if needed - // multiple attempts in case interfaces change while // we are in the middle of querying them. DWORD adapter_addresses_buffer_size = 16 * KB; for (int attempts = 0; attempts != 3; ++attempts) { adapter_addresses = (IP_ADAPTER_ADDRESSES*)malloc(adapter_addresses_buffer_size); assert(adapter_addresses); DWORD error = ::GetAdaptersAddresses( AF_UNSPEC, GAA_FLAG_SKIP_ANYCAST | GAA_FLAG_SKIP_MULTICAST | GAA_FLAG_SKIP_DNS_SERVER | GAA_FLAG_SKIP_FRIENDLY_NAME, NULL, adapter_addresses, &adapter_addresses_buffer_size); if (ERROR_SUCCESS == error) { // We're done here, people! break; } else if (ERROR_BUFFER_OVERFLOW == error) { // Try again with the new size free(adapter_addresses); adapter_addresses = NULL; continue; } else { // Unexpected error code - log and throw free(adapter_addresses); adapter_addresses = NULL; // @todo LOG_AND_THROW_HERE(); } } // Iterate through all of the adapters for (adapter = adapter_addresses; NULL != adapter; adapter = adapter->Next) { // Skip loopback adapters if (IF_TYPE_SOFTWARE_LOOPBACK == adapter->IfType) { continue; } // Parse all IPv4 and IPv6 addresses for ( IP_ADAPTER_UNICAST_ADDRESS* address = adapter->FirstUnicastAddress; NULL != address; address = address->Next) { auto family = address->Address.lpSockaddr->sa_family; if (AF_INET == family) { // IPv4 SOCKADDR_IN* ipv4 = reinterpret_cast<SOCKADDR_IN*>(address->Address.lpSockaddr); char str_buffer[INET_ADDRSTRLEN] = {0}; inet_ntop(AF_INET, &(ipv4->sin_addr), str_buffer, INET_ADDRSTRLEN); ipAddrs.mIpv4.push_back(str_buffer); } else if (AF_INET6 == family) { // IPv6 SOCKADDR_IN6* ipv6 = reinterpret_cast<SOCKADDR_IN6*>(address->Address.lpSockaddr); char str_buffer[INET6_ADDRSTRLEN] = {0}; inet_ntop(AF_INET6, &(ipv6->sin6_addr), str_buffer, INET6_ADDRSTRLEN); std::string ipv6_str(str_buffer); // Detect and skip non-external addresses bool is_link_local(false); bool is_special_use(false); if (0 == ipv6_str.find("fe")) { char c = ipv6_str[2]; if (c == '8' || c == '9' || c == 'a' || c == 'b') { is_link_local = true; } } else if (0 == ipv6_str.find("2001:0:")) { is_special_use = true; } if (! (is_link_local || is_special_use)) { ipAddrs.mIpv6.push_back(ipv6_str); } } else { // Skip all other types of addresses continue; } } } // Cleanup free(adapter_addresses); adapter_addresses = NULL; // Cheers! } 

आप अपने स्थानीय इंटरफ़ेस आंतरिक आईपी प्राप्त करने के लिए gethostbyname के बाद gethostname का उपयोग कर सकते हैं I

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

 //Example: b1 == 192, b2 == 168, b3 == 0, b4 == 100 struct IPv4 { unsigned char b1, b2, b3, b4; }; bool getMyIP(IPv4 & myIP) { char szBuffer[1024]; #ifdef WIN32 WSADATA wsaData; WORD wVersionRequested = MAKEWORD(2, 0); if(::WSAStartup(wVersionRequested, &wsaData) != 0) return false; #endif if(gethostname(szBuffer, sizeof(szBuffer)) == SOCKET_ERROR) { #ifdef WIN32 WSACleanup(); #endif return false; } struct hostent *host = gethostbyname(szBuffer); if(host == NULL) { #ifdef WIN32 WSACleanup(); #endif return false; } //Obtain the computer's IP myIP.b1 = ((struct in_addr *)(host->h_addr))->S_un.S_un_b.s_b1; myIP.b2 = ((struct in_addr *)(host->h_addr))->S_un.S_un_b.s_b2; myIP.b3 = ((struct in_addr *)(host->h_addr))->S_un.S_un_b.s_b3; myIP.b4 = ((struct in_addr *)(host->h_addr))->S_un.S_un_b.s_b4; #ifdef WIN32 WSACleanup(); #endif return true; } 

आप हमेशा केवल 127.0.0.1 का उपयोग कर सकते हैं जो हमेशा स्थानीय मशीन का प्रतिनिधित्व करता है।

विंडोज़ में सबनेट मास्क:

आप इस रजिस्ट्री एंट्री की उपकुंजियों को क्वेरी करके सबनेट मास्क (और गेटवे और अन्य जानकारी) प्राप्त कर सकते हैं:

HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ Tcpip \ Parameters \ इंटरफेस

रजिस्ट्री मान सबनेटमास्क देखें।

Windows में इंटरफ़ेस जानकारी प्राप्त करने के अन्य तरीके:

आप जिस जानकारी का उपयोग कर देख रहे हैं, वह पुनः प्राप्त कर सकते हैं: इस विकल्प के साथ WSAIoctl : SIO_GET_INTERFACE_LIST

इसके अलावा, ध्यान रखें कि "स्थानीय आईपी" एक विशेष रूप से अनूठी चीज़ नहीं हो सकता है यदि आप कई भौतिक नेटवर्क (वायर्ड + वायरलेस + ब्लूटूथ, उदाहरण के लिए, या ईथरनेट कार्ड आदि के साथ एक सर्वर) पर हैं, या TAP / TUN इंटरफ़ेस सेटअप है, तो आपकी मशीन आसानी से एक पूरी मेजबान इंटरफेस हो सकती है

कैसे नेटवर्क पर स्थानीय मशीन का आईपी पता प्राप्त करने के लिए समाधान का वर्णन काफी अच्छी तरह से लगता है …

टॉयलर से: यदि आप विंसॉक का उपयोग करते हैं, तो यहां एक तरीका है: http://tangentsoft.net/wskfaq/examples/ipaddr.html

प्रश्न के सबनेट भाग के लिए; सबनेट मुखौटा को POSIX सॉकेट एपीआई (जो कि सभी आधुनिक ऑपरेटिंग सिस्टम लागू होते हैं) के रूप में हासिल करने के लिए अज्ञात तरीके से मंच नहीं है, यह निर्दिष्ट नहीं करता है। तो आपको जिस प्लेटफ़ॉर्म का उपयोग कर रहे हैं उस पर जो विधि उपलब्ध है उसका उपयोग करना होगा।

आप मानक सी ++ में ऐसा नहीं कर सकते

मैं इसे पोस्ट कर रहा हूं क्योंकि यह एकमात्र सही उत्तर है आपका प्रश्न यह पूछता है कि सी ++ में कैसे करना है ठीक है, आप इसे सी ++ में नहीं कर सकते आप इसे विंडोज, पॉसिक्स, लिनक्स, एंड्रॉइड में कर सकते हैं, लेकिन ये सभी ओएस विशिष्ट समाधान हैं और भाषा मानक का हिस्सा नहीं हैं।

मानक C ++ में सभी पर एक नेटवर्किंग परत नहीं है

मुझे लगता है कि आपको यह गलत धारणा है कि सी ++ मानक अन्य भाषाओं के मानकों, जावा के रूप में सुविधाओं के समान दायरे को परिभाषित करता है। जबकि जावा में अंतर्निहित नेटवर्किंग हो सकती है (और यहां तक ​​कि जीयूआई ढांचा भी) भाषा की अपनी मानक लाइब्रेरी में, सी ++ नहीं करता है।

जबकि तृतीय-पक्ष एपीआई और लाइब्रेरीज़ हैं जो सी ++ प्रोग्राम द्वारा उपयोग किए जा सकते हैं, ऐसा कोई भी तरीका नहीं है जैसा कि आप इसे सी ++ में कर सकते हैं।

यह स्पष्ट करने के लिए एक उदाहरण है कि मेरा क्या मतलब है। आप एक फाइल को सी ++ में खोल सकते हैं क्योंकि इसकी मानक लाइब्रेरी के भाग के रूप में इसकी एक fstream क्लास है। यह CreateFile() का उपयोग करने के समान नहीं है, जो कि विंडोज-विशिष्ट फ़ंक्शन है और केवल WINAPI के लिए उपलब्ध है

विंसॉक विशिष्ट:

 // Init WinSock WSADATA wsa_Data; int wsa_ReturnCode = WSAStartup(0x101,&wsa_Data); // Get the local hostname char szHostName[255]; gethostname(szHostName, 255); struct hostent *host_entry; host_entry=gethostbyname(szHostName); char * szLocalIP; szLocalIP = inet_ntoa (*(struct in_addr *)*host_entry->h_addr_list); WSACleanup(); 

आप बस INADDR_BROADCAST को नहीं भेज सकते हैं? बेशक, वह सभी इंटरफेस पर भेज देंगे – लेकिन यह शायद ही कभी एक समस्या है।

अन्यथा, ioctl और SIOCGIFBRDADDR आपको win32 पर * निकस , और WSAioctl और SIO_GET_BROADCAST_ADDRESS पर पता प्राप्त करना चाहिए।

मैं वीएस2013 के तहत निम्न कोड के साथ DNS सेवा का उपयोग करने में सक्षम था:

 #include <Windns.h> WSADATA wsa_Data; int wsa_ReturnCode = WSAStartup(0x101, &wsa_Data); gethostname(hostName, 256); PDNS_RECORD pDnsRecord; DNS_STATUS statsus = DnsQuery(hostName, DNS_TYPE_A, DNS_QUERY_STANDARD, NULL, &pDnsRecord, NULL); IN_ADDR ipaddr; ipaddr.S_un.S_addr = (pDnsRecord->Data.A.IpAddress); printf("The IP address of the host %s is %s \n", hostName, inet_ntoa(ipaddr)); DnsRecordListFree(&pDnsRecord, DnsFreeRecordList); 

मुझे डेंसाई.लिब को लिंकर ऑप्शन में व्युत्पन्न निर्भरता के रूप में जोड़ना पड़ा।

संदर्भ यहाँ है

DEV C ++ में, मैं कोड के इस दिए गए टुकड़े के साथ शुद्ध सी का उपयोग WIN32 के साथ किया था:

 case IDC_IP: gethostname(szHostName, 255); host_entry=gethostbyname(szHostName); szLocalIP = inet_ntoa (*(struct in_addr *)*host_entry->h_addr_list); //WSACleanup(); writeInTextBox("\n"); writeInTextBox("IP: "); writeInTextBox(szLocalIP); break; 

जब मैं 'शो आईपी' बटन पर क्लिक करता हूं, तो यह काम करता है लेकिन दूसरी बार, प्रोग्राम (इशारा या त्रुटि के बिना) निकल जाता है। जब मैं करता हूं:

 //WSACleanup(); 

कार्यक्रम तेजी से गति के साथ कई बार एक ही बटन पर क्लिक करने से बाहर नहीं निकलता। तो WSACleanup () देव- C ++ के साथ अच्छी तरह से काम नहीं कर सकता ..

सबसे आसान तरीका!

प्रणाली ( "ipconfig");

अंत कोई चिंता नहीं 🙂