Boost::asio获取已连接远程客户端IP地址的方法问询
获取Boost::asio TCP客户端IP地址的方案
用socket的
remote_endpoint()是最优且最直接的方案
在acceptor.accept()成功拿到socket对象后,直接调用该socket的remote_endpoint()方法就能获取客户端的IP和端口信息,完全不需要解析任何消息。示例代码:boost::asio::ip::tcp::socket socket(io_context); acceptor.accept(socket); // 获取客户端端点 auto client_endpoint = socket.remote_endpoint(); // 转为字符串格式的IP std::string client_ip = client_endpoint.address().to_string(); // 获取端口 unsigned short client_port = client_endpoint.port();这个方法依赖TCP连接建立时操作系统记录的端点信息,Boost::asio只是做了封装,拿到的是传输层真实的客户端地址,比解析应用层消息靠谱得多。
完全没必要解析每条消息
解析消息属于应用层逻辑,用来获取客户端IP既冗余又容易出问题——比如客户端可以在消息里伪造IP,但remote_endpoint()拿到的是真实的连接来源,可信度更高。几乎没有更合适的替代方案
硬要找的话,你可以通过socket的原生句柄调用系统级API(比如Linux/Windows下的getpeername)获取端点信息,但这和Boost::asio的remote_endpoint()本质是一回事,后者已经封装了这些跨平台的系统调用,直接用封装好的方法更简洁省心。
内容的提问来源于stack exchange,提问作者pdaranda661
相关产品推荐
相关产品推荐

