2009-03-02 14 views
46

मैं बूस्ट एएसआईओ लाइब्रेरी का उपयोग कर सी ++ में एक सर्वर लिख रहा हूं। मैं अपने सर्वर के लॉग में दिखाए जाने के लिए क्लाइंट आईपी का स्ट्रिंग प्रस्तुति प्राप्त करना चाहता हूं। क्या कोई जानता है इसे कैसे करना है?बढ़ावा के आईपी पते को कैसे प्राप्त करें :: asio :: ip :: tcp :: सॉकेट?

उत्तर

67

सॉकेट में एक ऐसा फ़ंक्शन है जो रिमोट एंडपॉइंट पुनर्प्राप्त करेगा।

asio::ip::tcp::socket socket(io_service); 
// Do all your accepting and other stuff here. 

asio::ip::tcp::endpoint remote_ep = socket.remote_endpoint(); 
asio::ip::address remote_ad = remote_ep.address(); 
std::string s = remote_ad.to_string(); 

या एक लाइनर संस्करण:

asio::ip::tcp::socket socket(io_service); 
// Do all your accepting and other stuff here. 

std::string s = socket.remote_endpoint().address().to_string(); 
+0

आपके उत्तर के लिए धन्यवाद, मैं पता लगा श्रृंखला बस के रूप में लिखा जा सकता है:।। socket.remote_endpoint() को संबोधित() to_string() – kyku

+3

हाँ, इस तरह मैंने यह किया होगा (माना जाता है कि अंतरिम बिंदुओं पर नल या त्रुटियों की कोई संभावना नहीं थी)। मैंने इसे स्पष्टीकरण उद्देश्यों के लिए विस्तारित कर दिया। मेरी राय में, एक-लाइनर संस्करण बेहतर है (मुझे अपना कोड अपेक्षाकृत कॉम्पैक्ट पसंद है, इसलिए मैं इसे स्क्रीन पर अधिक देख सकता हूं)। – paxdiablo

21

मैं इस (लंबी-ish) आदेशों की श्रृंखला एक जाना देने हैं, तो वे दूरदराज के अंत आईपी पते की स्ट्रिंग प्रतिनिधित्व को पुनः प्राप्त करेगा या, boost::lexical_cast साथ, और भी आसान:

#include <boost/lexical_cast.hpp> 

std::string s = boost::lexical_cast<std::string>(socket.remote_endpoint()); 
+1

यह बहुत उपयोगी है क्योंकि इसमें 'पता()' और 'पोर्ट()', जो 'पता()। To_string() 'पत्तियां शामिल हैं। – Sean

+0

ध्यान दें कि एंडपॉइंट कनेक्ट नहीं होने पर यह अपवाद फेंकता है। – Claudiu

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