土法炼钢兴趣小组的算法知识备份

【Libevent】实战:透明代理 (Transparent Proxy)

源码下载

本文相关源码已整理,共 1 个文件。

打开下载目录 →

目录

透明代理是网络编程中最基础也最实用的项目。它的核心逻辑是将 A 端口收到的数据原封不动地转发给 B 端口。

1. 架构设计

我们需要维护两个连接: 1. Client -> Proxy: 接收用户请求。 2. Proxy -> Server: 转发给目标服务器。

核心逻辑: * Client 可读 -> 读数据 -> 写入 Server。 * Server 可读 -> 读数据 -> 写入 Client。

2. 代码实现

struct proxy_context {
  struct bufferevent *client_bev;
  struct bufferevent *server_bev;
};

// 通用读回调
void read_cb(struct bufferevent *src, void *arg) {
  struct proxy_context *ctx = arg;
  struct bufferevent *dst = (src == ctx->client_bev) ? ctx->server_bev : ctx->client_bev;
  
  struct evbuffer *input = bufferevent_get_input(src);
  struct evbuffer *output = bufferevent_get_output(dst);
  
  // 转发数据
  evbuffer_add_buffer(output, input);
  
  // 流量控制 (Backpressure)
  if (evbuffer_get_length(output) > MAX_BUFFER_SIZE) {
  bufferevent_disable(src, EV_READ);
  bufferevent_setcb(dst, read_cb, write_cb, event_cb, ctx);
  bufferevent_enable(dst, EV_WRITE); // 关注写事件,以便缓冲区排空后恢复读取
  }
}

3. 流量控制 (Backpressure)

这是代理服务器最关键的细节。如果 Server 处理很慢,而 Client 发送很快,Proxy 的内存会被撑爆。 策略: 当目标缓冲区过大时,暂停源端的读取 (bufferevent_disable(src, EV_READ))。当目标缓冲区数据发送出去后(水位下降),再恢复源端读取。

4. 总结

通过这个项目,我们练习了 bufferevent 的双向转发和流量控制。这是实现负载均衡器、SOCKS5 代理的基础。

完整代码: 11-transparent-proxy.c


上一篇: 07-hardening/pitfalls.md - 常见陷阱 下一篇: 08-projects/socks5.md - 实战:SOCKS5 代理

返回 Libevent 专题索引


By .