2010-04-20 5 views
28

का उपयोग कर स्थानीय आईपी पता प्राप्त करें मैं वर्तमान में स्थानीय आईपी पते प्राप्त करने का एक पोर्टेबल तरीका खोज रहा हूं। क्योंकि मैं बूस्ट का उपयोग कर रहा हूं वैसे भी मैंने सोचा कि इस कार्य के लिए Boost.Asio का उपयोग करना एक अच्छा विचार होगा।Boost.Asio

नेट पर कई उदाहरण हैं जो चाल चलाना चाहिए। उदाहरण:

Official Boost.Asio Documentation

Some Asian Page

मैं सिर्फ मामूली परिवर्तनों के साथ दोनों कोड की कोशिश की। Boost.Doc पर कोड को "www.boost.org" लेकिन "localhost" या इसके बजाय मेरा होस्टनाम हल करने के लिए बदला गया था। होस्टनाम प्राप्त करने के लिए मैंने boost :: asio :: ip :: host_name() का उपयोग किया या इसे स्ट्रिंग के रूप में सीधे टाइप किया।

इसके अतिरिक्त मैंने अपना स्वयं का कोड लिखा जो ऊपर दिए गए उदाहरणों और मेरे (छोटे) ज्ञान को बूस्ट दस्तावेज़ीकरण और अन्य उदाहरणों से एकत्रित किया गया था।

सभी स्रोतों काम किया, लेकिन वे सिर्फ निम्न IP वापस किया:
127.0.1.1
मैं चलाने (यह गलत वर्तनी, अंत में अपने .1.1 नहीं है) और जीसीसी 4.4 के साथ Ubuntu 9.10 पर कोड संकलित .1

एक सहयोगी ने उसकी मशीन पर एक ही कोड की कोशिश की और
127.0.0.2 मिला (नहीं लिखने में कोई त्रुटि भी ...)
वह संकलित और जीसीसी 4.4.1 के साथ Suse 11.0 पर चलने (मैं नहीं कर रहा हूँ 100% सुनिश्चित)

मुझे नहीं पता कि स्थानीयहोस्ट को बदलना संभव है (1 27.0.0.1), लेकिन मुझे पता है कि न तो मुझे या मेरे सहयोगी ने ऐसा किया था। ifconfig का कहना है कि लूपबैक 127.0.0.1 का उपयोग करता है। ifconfig को भी सार्वजनिक आईपी मिलती है जो मैं खोज रहा हूं (141.200.182.30 मेरे मामले में, सबनेट 255.255.0.0 है)

तो क्या यह एक लिनक्स-मुद्दा है और कोड पोर्टेबल नहीं है जैसा मैंने सोचा था? क्या मुझे कुछ और बदलना है या बूस्ट है। एसीओ मेरी समस्या के समाधान के रूप में काम नहीं कर रहा है?

मुझे पता है कि Stackoverflow और अन्य पृष्ठों पर समान विषयों के बारे में ज्यादा सवाल कर रहे हैं, लेकिन मैं जानकारी जो मेरे मामले में उपयोगी है नहीं मिल रहा। अगर आपको उपयोगी लिंक मिलते हैं, तो यह अच्छा होगा अगर आप मुझे इंगित कर सकें।

पुनश्च: यदि आप अपने/etc/hosts फ़ाइल संपादित करते हैं (यह है * nix केवल, खिड़कियों के लिए भी काम कर सकते हैं

#include <boost/asio.hpp> 
using boost::asio::ip::tcp;  

boost::asio::io_service io_service; 
tcp::resolver resolver(io_service); 
tcp::resolver::query query(boost::asio::ip::host_name(), ""); 
tcp::resolver::iterator iter = resolver.resolve(query); 
tcp::resolver::iterator end; // End marker. 
while (iter != end) 
{ 
    tcp::endpoint ep = *iter++; 
    std::cout << ep << std::endl; 
} 
+13

AFAIK, ASIO आपकी मशीन का इंटरफेस है, जो (लिनक्स या विंडोज पर GetAdaptersAddresses पर SIOCGIFCONF ioctl) की गणना करने के लिए एक रास्ता प्रदान नहीं करता है, ऐसा लगता है, क्या आप के बाद कर रहे हैं। कोड आपको बताएंगे कि आपकी मशीन का होस्ट नाम है, जो एक ही बात नहीं है, और के रूप में यह अपने नेटवर्क के विन्यास पर अधिक निर्भर है कम मजबूत है साथ DNS प्रश्नों (विशेष रूप से, डीएनएस "पता" के लिए आपकी मशीन का नाम है)। –

+0

क्या asio :: ip :: address_v4 :: loopback() आपकी आवश्यकताओं को पूरा करता है? इस संकेत के लिए – yanpas

उत्तर

4

...: यहाँ संशोधित कोड मैं Boost.Doc से प्रयोग किया जाता है मुझे यकीन नहीं है) आप इस मुद्दे को सही कर सकते हैं।

मेजबान अंदर फाइल की तरह कुछ मिल जाएगा: (इस Ubuntu है, ध्यान दें 1,1)

127.0.0.1 स्थानीय होस्ट
127.0.1.1 yourPcName.yourNetwork.tld

यदि आप यह परिवर्तन

127.0.0.1 स्थानीय होस्ट
127.0.1.1 yourPcName.yourNetwork.tld
your.real.ip.here yourPcName

फ़ाइल

तो होस्टनाम को ठीक से हल करना चाहिए।उचित संकल्प परीक्षण के

एक विधि "होस्ट नाम मैं" कमांड जो सही ढंग से बाद में इससे पहले कि आप मेजबान बदलने आपका IP पता गलत प्रिंट चाहिए और फिर साथ है।

बेशक इस गतिशील आईपी के लिए भयानक समाधान है ... हाँ।

+1

धन्यवाद। स्पष्ट रूप से Boost.Asio * nix-system का उपयोग करते समय बस इन मानों को पढ़ रहा है। यह मेरे लिए उबंटू 9 .10, 10.04 और सूज़ 11.2 के साथ काम किया। – MOnsDaR

6

यहाँ एक चाल मैं अजगर नेटवर्क प्रोग्रामिंग (गूगल) से सीखा मेरी मशीन का IP पता यह पता लगाने की है। यह केवल तभी काम करता है जब आपके पास इंटरनेट कनेक्शन हो और google.com से कनेक्ट हो और मुझे मेरी होम मशीन का 192.168.x.x निजी पता दे।

try { 
    boost::asio::io_service netService; 
    udp::resolver resolver(netService); 
    udp::resolver::query query(udp::v4(), "google.com", ""); 
    udp::resolver::iterator endpoints = resolver.resolve(query); 
    udp::endpoint ep = *endpoints; 
    udp::socket socket(netService); 
    socket.connect(ep); 
    boost::asio::ip::address addr = socket.local_endpoint().address(); 
    std::cout << "My IP according to google is: " << addr.to_string() << std::endl; 
} catch (std::exception& e){ 
    std::cerr << "Could not deal with socket. Exception: " << e.what() << std::endl; 

} 
+3

है ** नहीं ** आपके आईपी गूगल के अनुसार .. यह आपकी मशीन पर एक से कॉन्फ़िगर किया इंटरफेस के आईपी है। – unixman83

+1

यही वह है जिसे हमें स्थानीय आईपी पते की आवश्यकता है। @MOnsDaR के रूप में ifconfig/ipconfig द्वारा लौटाया गया है। यह मेरे विशेष मामले के लिए काम करता है जब मेरे पास कनेक्ट करने के लिए अन्य मशीन होती है। – fantastory

5

आप पा सकते हैं कोड के साथ "अपने" पता तुम्हें तैनात। लेकिन ... यह जटिल हो जाता है। कई एनआईसी हो सकते हैं, लैन और वैन पते, वायर्ड और वायरलेस, लूपबैक हो सकते हैं ... मेरे डेस्कटॉप पर मेरे पास एक एनआईसी था, लेकिन मेरे लेन पर दो diff DHCP सर्वर से दो ips ...

मुझे मिला उपयोगकर्ता को कमांड लाइन पैरामीटर के रूप में बाध्य करने के लिए आईपी प्रदान करना बेहतर था। और हाँ, यह एक पोर्टेबल समाधान है! :-)