易游网-易游模拟器

 找回密码
 立即注册
查看: 2289|回复: 0

[C/C++] libevent http服务获取阿里云https转发后的真实ip

[复制链接]

1406

主题

1663

帖子

1万

积分

管理员

夏墨独周

Rank: 9Rank: 9Rank: 9

积分
10094

论坛元老技术达人

QQ
发表于 2020-6-20 21:33:15 | 显示全部楼层 |阅读模式
1、一开始c++服务端使用http 作为接口没啥问题,后面渠道方强制只支持https接口

解决办法:
1、使用阿里云的https转发代理服务,价钱不贵,自己搭nginx比较麻烦
2、可以https访问接口后,发现获取的客户端ip每次都是变动的代理ip
3、服务端是libevent写的一个简易http内嵌服务。需要获取真实ip头。直接上代码:

std::vector<std::string> vStringSplit(const std::string& s, const std::string& delim = ","){
        std::vector<std::string> elems;
        size_t pos = 0;
        size_t len = s.length();
        size_t delim_len = delim.length();
        if (delim_len == 0) return elems;
        while (pos < len)
        {
                int find_pos = s.find(delim, pos);
                if (find_pos < 0)
                {
                        elems.push_back(s.substr(pos, len - pos));
                        break;
                }
                elems.push_back(s.substr(pos, find_pos - pos));
                pos = find_pos + delim_len;
        }
        return elems;
}

std::string szRemoteAddr = req->remote_host;
const char * szHeaderTmp = evhttp_find_header(req->input_headers, "X-Forwarded-For");
if (szHeaderTmp){
        std::string strHeaderTmp = szHeaderTmp;
        auto headers = vStringSplit(strHeaderTmp);
        if (headers.size() > 0)szRemoteAddr = headers[0];
}
evhttp_add_header(req->output_headers, "RemoteHost", szRemoteAddr.c_str());

来源:易游模拟器(QQ:207621422),转载请注明出处!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|易游网-易游模拟器 Copyright @2015-2021 ( 浙ICP备15028007号-1 )

GMT+8, 2024-5-7 09:04 , Processed in 0.023434 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表