redsocks源码阅读.docVIP

  • 25
  • 0
  • 约5.39千字
  • 约 4页
  • 2017-06-08 发布于河南
  • 举报
redsocks源码阅读

redsocks源码阅读 最近有机会了解和使用了开源软件redsocks,这是一个运行在设备端的代理服务器(proxy server)前端,在linux下能很好地支持iptables,实现系统级的透明代理。 redsocks是单线程的,包括所依赖的库libevent也是单线程的,因此适合运行在资源有限的嵌入式设备上,效率很高。在Android上也有一些应用程序(app)是基于redsocks开发的,比如ProxyDroid是一个Android上的透明代理软件,底层直接使用了redsocks,但是去掉了对DNS、UDP的支持。 redsocks处理网络通信、消息循环、缓冲区管理等都是基于开源库libevent的,因此在阅读 redsocks 源码前应先对 libevent 的 bufferevent、evbuffer 等有所了解,参考手册/~nickm/libevent-book/,据说Google的Chrome浏览器中也用了libevent。 redsocks用C语言写成,全部源码仅有7K余行,可从/darkk/redsocks下载,虽然该开源项目已有两三年没有被维护过,但代码质量很高,可读性也很好。 本文仅针对 http-relay 的情形阅读代码。Evernote上,此处内容有所删改)。 redsocks 创建两个socket,一个是 client 端的,在 redsocks.c 中的 redsocks_accept_client 中,accept 应用程序后得到 client_fd,并基于 client_fd 调用 bufferevent_new 创建了 client- client: client- client bufferevent_new client_fd, NULL, NULL, redsocks_event_error, client ; 然后调用 bufferevent_enable 设置 read 回调函数: if bufferevent_enable client- client, EV_READ ! 0 redsocks_log_errno client, LOG_ERR, bufferevent_enable ; goto fail; 然后 if self- relay_ss- connect_relay self- relay_ss- connect_relay client ; else redsocks_connect_relay client ;会调用 httpr_connect_relay,挂上读回调函数 httpr_client_read_cb: client- client- readcb httpr_client_read_cb; 所以 client 那边第一次有数据过来时,也就是 HTTP Request 头过来时,应该是 httpr_client_read_cb 会被调用,在 httpr_client_read_cb 里面从 buffev- input 中逐行读入 HTTP Request 头并分析、复制到 httpr- client_buffer 中,读取完后,connect_relay 被设为 1,先调用 httpr_client_read_content 将紧跟在 HTTP Request 头之后的一些数据也复制到 httpr- client_buffer 中,然后去调用 redsocks_connect_relay。 redsocks_connect_relay 调用 red_connect_relay,其中创建了另一个 socket,即 relay 端的 relay_fd,基于 relay_fd 调用 bufferevent_new 创建了 client- relay,回调函数 redsocks_relay_connected 作为写回调被挂上。 在 redsocks_relay_connected 中,将 httpr_relay_read_cb 和 httpr_relay_write_cb 分别作为 client- relay 的读、写回调被挂上(因此刚才的写回调 redsocks_relay_connected 被顶替掉了),并立即调用写回调 httpr_relay_write_cb,在该函数中将刚才读入到 httpr- client_buffer 中的 HTTP Request 头(及紧跟其后的一些数据)写入到 client- relay 中,其间还处理了认证信息,最后使能了 client- relay 的读事件(这里 buffev 就是 client- relay): buffev- wm_read.low 1; buffev- wm_r

您可能关注的文档

文档评论(0)

1亿VIP精品文档

相关文档