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

实战:透明代理 (Transparent Proxy)

目录

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