2009-03-02 41 views
46

Tôi đang viết một máy chủ trong C++ bằng cách sử dụng thư viện Boost ASIO. Tôi muốn nhận được biểu diễn chuỗi của IP của khách hàng được hiển thị trong nhật ký máy chủ của tôi. Có ai biết làm thế nào để làm điều đó?Cách lấy địa chỉ IP tăng :: asio :: ip :: tcp :: socket?

Trả lời

67

Ổ cắm có chức năng sẽ truy xuất điểm cuối từ xa. Anh sẽ cho này (dài ish) chuỗi các lệnh một đi, họ nên lấy chuỗi đại diện của điều khiển từ xa địa chỉ IP cuối:

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(); 

hoặc phiên bản one-liner:

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

Cám ơn câu trả lời của bạn, tôi đã tìm ra các chuỗi có thể được viết đơn giản là:.. giải quyết socket.remote_endpoint()() to_string() – kyku

+3

Vâng, đó là cách tôi đã làm nó (giả sử không có khả năng của null hoặc lỗi tại các điểm tạm thời). Tôi để nó mở rộng cho mục đích giải thích. Theo tôi, phiên bản một lớp là tốt hơn (tôi thích mã của tôi tương đối nhỏ gọn vì vậy tôi có thể thấy nhiều hơn trên màn hình). – paxdiablo

21

hoặc, thậm chí dễ dàng hơn, với boost::lexical_cast:

#include <boost/lexical_cast.hpp> 

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

Điều này rất hữu ích vì nó bao gồm cả 'address()' và 'port()', mà 'address(). To_string()' rời khỏi. – Sean

+0

Lưu ý rằng điều này sẽ ném ngoại lệ nếu điểm cuối không được kết nối. – Claudiu

Các vấn đề liên quan