透明代理是网络编程中最基础也最实用的项目。它的核心逻辑是将 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 代理