如何使用uWebSockets(uWS)获取HTTP请求的发送端IP地址
uWebSockets C++ 从HTTP请求中获取客户端IP的方案
不需要将HTTP连接升级为WebSocket来获取IP,uWS原生提供了HTTP场景下的客户端IP获取能力,具体实现如下:
1. 直连场景(无反向代理,客户端直接访问uWS服务)
直接调用HTTP响应对象的getRemoteAddress()方法即可拿到客户端原始IP,修改你的示例代码如下:
#include <iostream> #include "App.h" int main() { /* 极简Hello World示例 */ uWS::App().get("/*", [](auto *res, auto *req) { // 获取客户端IP地址 std::string_view client_ip = res->getRemoteAddress(); std::cout << "客户端IP:" << client_ip << std::endl; res->end("Hello world!"); }).listen(3000, [](auto *listen_socket) { if (listen_socket) { std::cout << "Listening on port " << 3000 << std::endl; } }).run(); std::cout << "Failed to listen on port 3000" << std::endl; return 0; }
2. 反向代理场景(经过Nginx、CDN等中间层转发)
此时getRemoteAddress()获取到的是代理服务器的IP,需要从HTTP请求头中提取X-Forwarded-For或者X-Real-IP字段获取真实客户端IP,示例代码如下:
uWS::App().get("/*", [](auto *res, auto *req) { // 从请求头获取代理转发的真实IP std::string_view real_ip = req->getHeader("x-forwarded-for"); // 如果代理配置的是X-Real-IP头就换成 req->getHeader("x-real-ip") std::cout << "真实客户端IP:" << real_ip << std::endl; res->end("Hello world!"); })
注意:
getRemoteAddress()方法在uWS C++ v19及以上稳定版本均支持,低版本可升级到官方最新稳定版使用该能力。
内容的提问来源于stack exchange,提问作者Janith Priyankara
相关产品推荐
相关产品推荐

