当前位置: 首页 > news >正文

安阳做网站多少钱邢台最新通告今天

安阳做网站多少钱,邢台最新通告今天,面试简历模板,网站的建设与维护就业方向在使用 libwebsockets 开发服务端时,若客户端通过代理(如 Nginx、HAProxy 等)连接,直接获取的通常是代理服务器的 IP。要获取客户端真实 IP,需通过代理服务器传递的特定 HTTP 头信息(如 X-Forwarded-For 或…

在使用 libwebsockets 开发服务端时,若客户端通过代理(如 Nginx、HAProxy 等)连接,直接获取的通常是代理服务器的 IP。要获取客户端真实 IP,需通过代理服务器传递的特定 HTTP 头信息(如 X-Forwarded-ForX-Real-IP)解析。以下是具体实现方法:

核心原理

代理服务器会在转发请求时,将客户端真实 IP 写入 HTTP 头字段(需代理提前配置),常见字段:

  • X-Forwarded-For:格式为 客户端真实IP, 代理1IP, 代理2IP(最左侧为真实IP)。
  • X-Real-IP:直接记录客户端真实IP(通常由一级代理设置)。

libwebsockets 服务端可在握手阶段解析这些头字段,提取真实 IP。

实现步骤

1. 代理服务器配置(以 Nginx 为例)

确保代理服务器正确添加转发头,示例 Nginx 配置:

location /ws {proxy_pass http://127.0.0.1:8080;  # 指向libwebsockets服务端proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "Upgrade";proxy_set_header Host $host;# 关键:添加真实IP头proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
2. libwebsockets 服务端获取真实 IP

在 libwebsockets 回调函数中,通过 lws_hdr_copy 接口获取代理头字段,解析出真实 IP。

#include <libwebsockets.h>
#include <string.h>
#include <stdio.h>#define MAX_IP_LEN 64// 解析X-Forwarded-For获取真实IP(取第一个IP)
static const char* get_real_ip_from_forwarded(const char* forwarded) {if (!forwarded) return NULL;static char real_ip[MAX_IP_LEN];// X-Forwarded-For格式:"client_ip, proxy1_ip, proxy2_ip"const char* comma = strchr(forwarded, ',');if (comma) {size_t len = comma - forwarded;if (len < MAX_IP_LEN) {memcpy(real_ip, forwarded, len);real_ip[len] = '\0';return real_ip;}}// 若没有逗号,整个字段即为真实IPreturn forwarded;
}// 回调函数:处理WebSocket事件
static int callback_server(struct lws *wsi, enum lws_callback_reasons reason,void *user, void *in, size_t len) {switch (reason) {case LWS_CALLBACK_ESTABLISHED: {// 连接建立时获取IPchar client_ip[MAX_IP_LEN] = {0};char proxy_ip[MAX_IP_LEN] = {0};const char* real_ip = NULL;// 1. 获取代理头X-Forwarded-Forif (lws_hdr_copy(wsi, proxy_ip, sizeof(proxy_ip), WSI_TOKEN_X_FORWARDED_FOR) > 0) {real_ip = get_real_ip_from_forwarded(proxy_ip);}// 2. 若X-Forwarded-For不存在,尝试X-Real-IPif (!real_ip && lws_hdr_copy(wsi, proxy_ip, sizeof(proxy_ip), WSI_TOKEN_X_REAL_IP) > 0) {real_ip = proxy_ip;}// 3. 若均不存在,使用默认的客户端IP(可能是代理IP)if (!real_ip) {lws_get_peer_addresses(wsi, lws_get_socket_fd(wsi), client_ip, sizeof(client_ip), NULL, 0);real_ip = client_ip;}printf("客户端真实IP: %s\n", real_ip);break;}// 其他事件处理(略)default:break;}return 0;
}// 协议配置
static const struct lws_protocols protocols[] = {{"default",callback_server,0,  // 不使用用户数据4096, // 接收缓冲区大小},{ NULL, NULL, 0, 0 } // 协议结束标记
};int main() {struct lws_context_creation_info info;struct lws_context *context;memset(&info, 0, sizeof(info));info.port = 8080;info.protocols = protocols;info.options = LWS_SERVER_OPTION_HTTP_HEADERS_SECURITY_BEST_PRACTICES_ENFORCE;// 创建WebSocket上下文context = lws_create_context(&info);if (!context) {fprintf(stderr, "创建上下文失败\n");return 1;}printf("服务端启动,端口: %d\n", info.port);// 事件循环while (lws_service(context, 50) >= 0);// 清理资源lws_context_destroy(context);return 0;
}

关键代码解析

  1. 获取代理头字段
    通过 lws_hdr_copy 函数提取 X-Forwarded-ForX-Real-IP 头,对应的令牌分别为:

    • WSI_TOKEN_X_FORWARDED_FOR:对应 X-Forwarded-For
    • WSI_TOKEN_X_REAL_IP:对应 X-Real-IP
  2. 解析 X-Forwarded-For
    该字段可能包含多个 IP(逗号分隔),取第一个即为客户端真实 IP(如 client_ip, proxy1, proxy2 中提取 client_ip)。

  3. 降级策略
    若代理头不存在,通过 lws_get_peer_addresses 获取原始连接 IP(通常是代理服务器 IP)。

注意事项

  1. 代理信任问题
    仅信任已知代理服务器的 X-Forwarded-ForX-Real-IP 头,防止客户端伪造这些头字段。可在服务端限制仅接收特定代理 IP 的请求。

  2. libwebsockets 版本兼容
    不同版本的 libwebsockets 头字段令牌可能不同(如旧版本可能需要直接使用字符串 X-Forwarded-For 而非枚举值),需根据实际版本调整。

  3. IPv6 支持
    若需支持 IPv6,需调整 IP 缓冲区大小(MAX_IP_LEN),并处理 IPv6 格式(如 ::1)。

通过以上方法,libwebsockets 服务端可正确获取经过代理的客户端真实 IP,适用于反向代理、负载均衡等场景。

http://www.dtcms.com/a/478707.html

相关文章:

  • 如何做高并发网站的架构设计地方型旅游网站
  • 网站文章伪原创怎么做网站建设策划基本流程图
  • 条件概率、全概率、贝叶斯
  • 用mvc做网站报告自己的电脑做服务器搭建网站
  • 更换网站模板html所有标签大全
  • 软件模拟存储,SCSI映射StarWind5.4 企业版
  • DFS和BFS算法和回溯算法
  • c++ 标准模板库练习
  • 购物网站建设费用wordpress调用python脚本
  • 基于深度学习的数字图像分类实验与分析
  • 图像视觉——颜色识别
  • 扬州网站建设哪家公司好电商运营适合女生吗
  • HTML应用指南:利用POST请求获取全国兴业银行网点位置信息
  • Excel处理控件Aspose.Cells教程:使用 Python 将 HTML 转换为 Excel
  • 菏泽做网站的公司可玩儿小程序可以加盟么
  • 阿里云发布《AI 原生应用架构白皮书》
  • 如何在百度上注册自己的网站做网站运营有提成吗
  • 分布式数据库架构:从分库分表到NewSQL实战
  • Java的双重检查锁机制(DCL)与懒加载的单例模式
  • Qt代码-QVector向量数组的增删改查插入统计复制
  • 深圳建设门户网站博客wordpress
  • 免费做网站的好不好大理悦花轩客栈在哪些网站做推广
  • 语义与认知中的循环解释悖论及其对人工智能自然语言处理深层语义分析的影响与启示
  • 购物类网站百度关键词搜索排名
  • 微信公众号的跳转网站怎么做外贸网站要先备案吗
  • 【VSCode+WSL】开发环境随身携带:我的VSCode+cpolar远程工作站实战
  • 长沙做最好网站东营建设信息网的网址
  • Kubernetes Pod 全面详解(基础 + 进阶)
  • JAVA算法练习题day40
  • 电子电气架构 --- 车载多系统架构