【libevent】 反向代理

evhttp-http-proxy:通过 libevent 实现的 HTTP 代理 evhttp-http-proxy 通过 libevent 实现的 HTTP 代理 请注意,需要 libevent-streaming,即 libevent 的扩展。 您可以忽略“pcmm”相关代码。 立即下载

使用libevent反向代理

转载自: https://blog.youkuaiyun.com/toontong/article/details/6029151

/**********************
 * ToonTonG@163.com
 * chuantong.huang@gmail.com
 * 2010-11-23
 * 简单的http反向代理
 * *******************/
#include<stdio.h>
#include<stdlib.h>
#include<sys/queue.h>
#include<event.h>
#include<evhttp.h>
char *proxy_host = "10.20.187.231";
unsigned int proxy_port = 80;
int proxy_timeout_in_secs = 60;

// called per chunk received
void chunkcb(struct evhttp_request * req, void * arg) {
	struct evhttp_request *response = (struct evhttp_request *)arg;
	evbuffer_add_buffer(((struct evhttp_request *)arg)->output_buffer , req->input_buffer);
	if (++response->chunked == req->chunked)
	{
		evhttp_send_reply(response, req->response_code, req->response_code_line, req->input_buffer);
		return;
	}
}

// gets called when request completes
void reqcb(struct evhttp_request * req, void * arg) {
	struct evhttp_request *response = (struct evhttp_request*)arg;
	if(!req){
		fprintf(stdout, "http close.");
		evhttp_send_reply(response, 504, "Bad Gateway.", NULL);
		return;
	}
	if (response->chunked)
		return;
	struct evkeyval *header;
	TAILQ_FOREACH(header, req->input_headers, next) {
			evhttp_add_header( response->output_headers,
								(const char *)header->key,
								(const char *)header->value);
	}
	evhttp_send_reply(response, req->response_code, req->response_code_line, req->input_buffer);
	evhttp_send_reply_end(response);
}

struct evhttp_request *proxy_request(const char *domain,
		unsigned short port,
		int timeout_in_secs,
		struct evhttp_request *response)
{
	struct evhttp_connection *evhttp_connection = NULL;
	struct evhttp_request *evhttp_request = NULL;
	evhttp_connection = evhttp_connection_new(domain, port);
//	evhttp_connection_set_local_address(evhttp_connection, &local_addr); //可以为每个连接设置本地IP,一台机可以多个IP,就可超过65535-1024个连接
	evhttp_request = evhttp_request_new(reqcb, (void*)response);
	evhttp_request->chunk_cb = chunkcb;
	struct evkeyval *header;
	TAILQ_FOREACH(header, response->input_headers, next) {
		evhttp_add_header( evhttp_request->output_headers,
							(const char *)header->key,
							(const char *)header->value);
	}
	if (response->type == EVHTTP_REQ_POST){
		evbuffer_add_buffer(evhttp_request->output_buffer , response->input_buffer);
	}
	evhttp_make_request(evhttp_connection, evhttp_request, response->type, response->uri);
	evhttp_connection_set_timeout(evhttp_request->evcon, timeout_in_secs);
	event_loop(EVLOOP_NONBLOCK);
	return evhttp_request;
}

/* 处理函数 */
void pushproxy_handler(struct evhttp_request *req, void *arg)
{
	fprintf(stdout, "request %s/n", req->uri);
	/* 只处理GET与POST请求 */
	if (EVHTTP_REQ_GET != req->type && EVHTTP_REQ_POST != req->type){
		goto response;
	}
	if(!proxy_request(proxy_host, proxy_port, proxy_timeout_in_secs, req)){
		fprintf(stderr, "connect to server fail.");
		goto response;
	}
//    struct evbuffer *buf;
//    buf = evbuffer_new();
    /* 分析URL参数 ,接收GET表单参数, 修改代码根据不同的url反向代理在不同的服务器 */
//  char *decode_uri = strdup((char*) evhttp_request_uri(req));
//  struct evkeyvalq http_query;
//	evhttp_parse_query(decode_uri, &http_query);
//	free(decode_uri);
//	const char *input_uid = evhttp_find_header (&http_query, "uid"); /* 队列名称 */
//	if ( NULL == input_uid || 0 == strlen(input_uid) )
//	{
//		evhttp_send_reply(req, HTTP_NOTFOUND, "404 Not Found.", buf);
//		goto response;
//	}
	/* 内存释放 */
//	evhttp_clear_headers(&http_query);
//	evbuffer_free(buf);
	return;
response:
	evhttp_send_error(req, 502, "Bad Gateway.");
	return;
}

int main(int argc, char **argv)
{
	char *pushproxy_settings_listen = "0.0.0.0";
	int pushproxy_settings_port = 8008;
	int pushproxy_settings_timeout = 60;
	/* 请求处理部分 */
	struct evhttp *httpd;
	event_init();
	httpd = evhttp_start(pushproxy_settings_listen,pushproxy_settings_port);
	if (httpd == NULL) {
		fprintf(stderr, "Error: Unable to listen on %s:%d/n/n", pushproxy_settings_listen, pushproxy_settings_port);
		exit(1);
	}
	evhttp_set_timeout(httpd, pushproxy_settings_timeout);
	/* Set a callback for all other requests. */
	evhttp_set_gencb(httpd, pushproxy_handler, NULL);
	fprintf(stdout, "ok: going in loop event");
}
基于libevent的代理服务 基于libevent实现的网络穿透,以及数据处理。可以处理外部的LUA脚本。 立即下载

相关推荐

无线充电效率从75%到90%+:深入拆解LCC补偿网络如何成为电动汽车和智能车竞赛的‘稳压器’

本文深入探讨了LCC补偿网络如何显著提升无线充电效率至90%以上,成为电动汽车和智能车竞赛中的关键技术。通过分析LCC的三元件结构和双模式切换特性,揭示了其在负载突变和线圈错位情况下的稳定性优势,并展示了实际应用中的效率提升和产业化挑战。

weixin_42528191的博客 396

【原创】libevent练手之--简单的反向代理,非阻塞,能超越65535连接上限

背景信息--- 单机tcp连接上限      当建立一个tcp连接时,客户端被分配(或者你可以指定)一个端口,范围在 /proc/sys/net/ipv4/ip_local_port_range里 . 假如你手工指定也没什么问题, 用临时端口我们会超出界限。我设置这个范围在“1024 65535″之间 – 这就意味这有65535-1024 = 64511个端口可用。也即同时只能反向代理这么多个请求。但,可以弄多个新的IP地址, 每个让他建立62000个连接 – 以17个IP为例,共1,054,000 个连接

toontong的专栏 7627

量子密钥分发系统设计与实现(一):系统基本架构讨论

本文主要对量子密钥分发系统中的基础架构和基于系统的量子密钥协商过程进行了初步讨论,为后期系列文章进行铺垫。

量子领域相关话题 3891

手把手教你实现nginx反向代理服务器

1.反向代理 代理服务器根据其代理对象的不同,可以分为正向代理服务器与反向代理服务器。这里 的“正”与“反”均是站在客户端角度来说的。 要明白反向代理,就得知道什么是正向代理. 2.正向代理服务器 正向代理是对客户端的代理。客户端 C 想要从服务端 S 获取资源,但由于某些原因不能,直接访问服务端,而是通过另外一台主机 P 向服务端发送请求。当服务端处理完毕请求后,将响应发送给主机 P,主机 P ...

吴成伟的博客 1197

YOLOv5改进——添加SimAM注意力机制

这样可以使注意力机制看到整个backbone部分的特征图,将具有全局视野,类似于一个小的transformer结构。注意:很多改进教程都是将代码直接复制到common.py文件,如果改进机制多了容易造成混乱。在models文件夹下新建modules文件夹,在modules文件夹下新建一个py文件。这里为simam.py。在models文件夹下,复制yolov5s.yaml文件,粘贴并重命名为yolov5s-simam.yaml。运行yolo.py,出现刚刚加入的SimAM注意力机制,说明加入成功。

2302_80099075的博客 1653

团结引擎+OpenHarmony 2实战篇:从零构建鸿蒙应用开发环境

本文详细介绍了如何从零开始构建鸿蒙应用开发环境,重点讲解了团结引擎与OpenHarmony 2的实战配置步骤。内容包括DevEco Studio安装、OpenHarmony SDK配置、团结引擎集成及项目创建等关键环节,帮助开发者快速搭建高效的开发环境,提升鸿蒙应用开发效率。

weixin_29294395的博客 262

使用libevent evhttp做服务器提供文件上传、下载、查询功能

文件上传 post接口/xpoc/ue-fse-uploadfd请求报文如下: 请求头header如下 body如下: //上传post接口/xpoc/ue-fse-uploadfd请求报文如下: 请求头header如下 在这里插入图片描述 //文件上传接口的回调处理函数 void HttpUpFile(struct evhttp_request *req, void *arg) { char * pBoundary = NULL; char strtemp[260];

weixin_45312249的博客 2770

uniapp [全端兼容] - 详细实现全局修改设置字体大小功能效果,统一修改页面字号字体大小,一键改变字号整个项目立即生效,大中小字号预设、老年人大字模式场景,uniApp全平台兼容控制页面字号大小

uni-app,h5移动端网页,微信小程序,支付宝小程序,Android安卓,苹果ios,app,nvue,修改字体大小,一键调整UniApp字体大小,实时改变不用刷新,动态设置字体大小,uniapp全局修改字体字号大小,如何控制全局字号,可调整显示的字体,全项目生效,老年人大字模式,改变所有页面的字体,全局设置字体大小,实现小中大的字体切换,设置改变全局字体大小功能,如何做到全平台兼容,H5APP实现全局字体大小调整,不兼容报错,用户设置字号,全局设置应用字体大小,大中小字体修改,页面设置page-me

🏆 前端领域优质创作者 1万+

Linux下使用bufferevent实现tcp代理功能

bufferevent是libevent网络库的一套接口,内部实现了对socket的封装,对外提供数据读写接口,支持并发编程的场景; 外部使用接口时仅需考虑业务逻辑的处理,无需在意socket的处理细节;

staticnetwind的专栏 2115

使用 Simulink 实现基于相控阵雷达的波束形成技术

摘要:本文详细介绍了利用MATLAB Simulink和Phased Array System工具箱实现相控阵雷达波束形成的完整流程。主要内容包括:1)创建Simulink模型;2)设计天线阵列参数;3)信号生成模块配置;4)波束形成算法实现;5)结果可视化方法;6)仿真调试与优化;7)代码导出与部署。通过分步指导,读者可以掌握从理论到实践的完整开发流程,包括关键参数设置和算法实现示例。该方案适用于军事、气象等领域的雷达系统开发,并支持后续嵌入式和智能算法集成。

xiaoheshang_123的博客 179

【ChatGPT】实用 Prompt 指令大全 —— 一文教你如何更好地挖掘 GPT 的价值

ChatGPT 是由 OpenAI 开发的一种先进的大型语言生成模型,能够理解和生成准确、自然且连贯的文本。文本生成数据分析内容审核语义理解自然语言推理以及其他众多任务ChatGPT是一种基于GPT-3.5架构的大型语言模型,由OpenAI公司开发。该模型在自然语言处理领域有着广泛的应用,可以用于文本生成、文本分类、情感分析、问答系统等任务。本文将从模型的架构、训练方式、优缺点等方面对ChatGPT进行详细介绍。一、模型架构。

AI天才研究院 2万+

PHP的性能优化

把图片保存在高速缓存服务器,用 phprpc 远程调用 memcache 也用了 libevent库 我们现在用 nginx 做反向代理,实现负载均衡    类似 apache dbanotes.net 讲数据库比较多  RewriteEngine On  RewriteCond %{REQUEST_URI} !^.*(/.css|/.js|/.gif|/.

ruanchao的专栏 661

基于Verilog的8位CPU设计及UART扩展实现方案,包含完整的架构设计、核心代码实现和仿真验证方法

基于Verilog的8位CPU设计及UART扩展实现方案,包含完整的架构设计、核心代码实现和仿真验证方法

a_zxswer的博客 186

腾讯云服务器ubuntu18.04搭建FastDFS文件服务器

腾讯云服务器ubuntu18.04搭建FastDFS文件服务器 FastDFS简介 FastDFS是用c语言编写的一款开源的分布式文件系统。FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。 FastDFS文件上传流程: Storage Server(仓库工人)定...

weixin_43269840的博客 689

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

TOMCAT+Memcached

本文章主要介绍memcached,如何有效提高数据处理的效率,最后会有一个配合nginx以及tomcat的综合实验去教大家如何运用

ashina_01的博客 1051

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

centos下 搭建 AppRTC 服务

所有服务搭建在同一台centos服务器上(192.168.5.8),效果图: 搭建AppRTC 0、创建目录 mkdir ~/webrtc cd ~/webrtc 安装需要的各种工具(除了apt之外还可以下载安装包或者源码自己编译安装): 1、安装JDK #为了演示初始环境 已重装系统, 重装后先执行: yum -y install java-1.8.0-openjdk java-1.8.0-openjdk-devel #查看安装路径 dirname $(r...

EveryDayOneHour的博客 1060

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

内网穿透反向代理应用 xfrp

授权协议: Apache 开发语言: C/C++ 操作系统: 跨平台 软件首页: https://github.com/KunTengRom/xfrp 软件文档: https://github.com/KunTengRom/xfrp 官方下载: https://github.com/KunTengRom/xfrp 软件介绍 xfrp 是一个可用于内网穿透的高性能的反向代理应用,与 xfrps 配合...

qq_40907977的博客 1789

10分钟搭建自己的个人知识库:LLM Wiki 零基础上手教程

查资料是不是总翻半天,翻到了还散落在十几份 PDF 里对不上号?LLM Wiki 是一款跨平台桌面应用,能把你的文档变成自动互联的个人知识库:AI 读完文档后写成 Wiki 页面存进库里,并持续维护更新。本文带你完成安装、接入模型和第一次导入提问,10 分钟跑出一个能查能问、还会图谱可视化的知识库。 ## 为什么是它 很多 RAG(检索增强生成:每次提问时模型临时从原文里翻碎片再拼答案)工具有

gitblog_06810的博客 163

如何在 CentOS 7 用 cPanel 配置 Nginx 反向代理

Nginx 是最快和最强大的 Web 服务器之一,以其高性能和低资源占用率而闻名。它既可以被安装为一个独立的 Web 服务器,也可以安装成反向代理 Web 服务器。在这篇文章,我将讨论在安装了 cPanel 管理系统的 Centos 7 服务器上安装 Nginx 作为 Apache 的反向代理服务器。 Nginx 作为前端服务器用反向代理为静态文件提供服...

weixin_34309435的博客 130

fastDFS 安装

本文详细介绍了FastDFS分布式文件系统的安装配置过程。主要内容包括:1)安装libevent依赖库;2)安装libfastcommon基础库并配置软连接;3)编译安装FastDFS主程序;4)配置tracker、storage和client服务;5)集成nginx模块实现文件访问;6)测试文件上传和访问功能。安装过程涉及多组件的编译配置、用户权限设置、服务启动等步骤,最终实现了通过nginx访问FastDFS存储的文件资源。

425

关于libevent+http服务端的一个样例

#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include

chn475111的博客 5691

Tomcat

一、功能介绍Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和 并发访问用户不是很多的场合下被普遍使用,Tomcat 具有处理HTML页面的功能,它还是一个Servlet和 JSP容器.起始于SUN 公司的一个Servlet的参考实现项目 Java Web Server,开发者是 James Duncan Davidson, 在1999年,将项目贡献给了apache软件基金会(ASF),和ASF现有的项目 JServ 合并,并开源成为顶级项目。

weixin_70790602的博客 1033

Centos系统安装 Webdis + Nginx

Webdis 主要是为 Redis 提供 HTTP 接口,使得通过 HTTP 即可直接操作Redis,极高的提升了效率。 webdis: A fast HTTP interface for Redis。 特点: 1、Simple HTTP2、JSON(P) output, and other formats3、Chunked pub/sub4、Access Control by IP+m

2549

【网络进阶】redis、memcached、nginx网络组件(三)

在这篇博客中,我们详细探讨了Nginx的环境、多线程处理和Reactor模式。首先,Nginx作为反向代理服务器,隐藏了服务器信息,增强了安全性。同时,Nginx通过多进程处理业务,提高并发处理能力。其次,我们解析了Nginx为何采用多线程,这源于其需处理的业务类型复杂,且多进程模型能避免加锁操作,提升处理效率。最后,Nginx的Reactor模式解决了"惊群问题",并实现了在用户层处理连接的负载均衡。当处理连接数达到阈值,它将自动调整负载,保证了处理性能。

Ricky的博客 535

nginx反向代理

#安装nginx依赖、初始化服务 yum install -y gcc gdb strace gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-d

shujuliu818的专栏 213

Nginx[001]socket多进程及IO复用

正向代理: 客户端非常明确要访问的服务器地址; 服务器只清楚请求来自哪个代理服务器; 而不清楚来自哪个具体的客户端; 正向代理模式屏蔽或者隐藏了真实客户端信息; 反向代理: 多个客户端给服务器发送的请求, Nginx服务器接收到之后; 按照一定的规则分发给了后端的业务处理服务器进行处理了; 此时, 请求的来源也就是客户端是明确的; 但是请求具体由哪台服务器处理的并不明确了; Nginx扮演的就是一...

qq_35315314的博客 348
上一篇: 【C++】 string split
下一篇: 【Qt】根据界面所在显示器自适应调整ui大小
欧恩意
博客等级 码龄7年 677粉丝 138原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值