Muduo 网络编程示例之十:socks4a 代理服务器
陈硕 (giantchen_AT_gmail)
Blog.csdn.net/Solstice t.sina.com.cn/giantchen
这是《Muduo 网络编程示例》系列的第十篇文章,本系列暂告一段落。
Muduo 全系列文章列表: http://blog.csdn.net/Solstice/category/779646.aspx
本文介绍用 muduo 实现一个简单的 socks4a 代理服务器,代码见 http://code.google.com/p/muduo/source/browse/trunk/examples/socks4a/ 。
在实现 socks4a proxy 之前,我们先写一个功能更简单的网络程序—— TCP 中继器 (TCP relay),或者叫做穷人的 tcpdump (poor man's tcpdump)。
一般情况下,客户端程序直接连接服务端,如下图。有时候,我们想在 client 和 server 之间放一个中继器 (relay),把 client 与 server 之间的通信内容记录下来。这时用 tcpdump 是最方便省事的,但是 tcpdump 需要 root 权限,万一没有 root 密码呢?穷人有穷人的办法,自己写一个 relay,让 client 连接 relay,再让 relay 连接 server,如下图中的 T 型结构,relay 扮演了类似 proxy 的角色。
TcpRelay 是我们自己写的,可以动动手脚。除了记录通信内容,还可以制造延时,或者故意翻转 1 bit 数据以模拟 router 硬件故障。
TcpRelay 的功能(业务逻辑)看上去很简单,无非是把连接 C 上收到的数据发给连接 S,同时把连接 S 上收到的数据发给连接 C。但仔细考虑起来,细节其实不那么简单:
在看 muduo 的实现之前,请读者思考:如果用 Sockets API 来实现 TcpRelay,如何解决以上这些问题。
TcpRelay 的实现很简单,只有几十行代码 http://code.google.com/p/muduo/source/browse/trunk/examples/socks4a/tcprelay.cc,主要逻辑都在 Tunnel class 里
http://code.google.com/p/muduo/source/browse/trunk/examples/socks4a/tunnel.h 。这个实现解决了前三个问题,第四个留给将来吧。
Socks4a 的功能与 TcpRelay 非常相似,也是把连接 C 上收到的数据发给连接 S,同时把连接 S 上收到的数据发给连接 C。它与 TcpRelay 的区别在于,TcpRelay 固定连到某个 server 地址,而 socks4a 允许 client 指定要连哪个 server。在 accept 连接 C 之后,Socks4a server 会读几个字节,以了解 server 的地址,再发起连接 S。
Socks4a 的协议非常简单,请参考维基百科 http://en.wikipedia.org/wiki/SOCKS#SOCKS_4a 。
muduo 的 socks4a 代理服务器的实现在 http://code.google.com/p/muduo/source/browse/trunk/examples/socks4a/socks4a.cc,它也使用了 Tunnel class。与 TcpRelay 相比,只多了解析 server 地址这一步骤。
muduo 这个 socks4a 是个标准的网络服务,可以供 Web 浏览器使用(我正是这么测试它的)。
云风在《写了一个 proxy 用途你懂的》中写了一个 TCP 隧道 tunnel,程序由三部分组成:n:1 连接转发服务,1:n 连接转发服务,socks 代理服务。
我仿照他的思路,用 muduo 实现了这三个程序。不同的是,我没有做数据混淆,所以不能用来翻传说中的墙。
有兴趣的读者可以把这三个程序级联起来试一试。
《Muduo 网络编程示例》从今年2月初开始写,到今天正好是四个月,我写了十一篇博客,基本按计划完成了任务。这个系列暂告一段落。
这个系列基本涵盖了 muduo 为编写单线程服务端和客户端 TCP 网络程序提供的功能,muduo 的能力不止于此:
以上两点在以后的文章里会提及,不会明珠暗藏。
Muduo 在 2010 年 8 月底发布 0.1.0 版,随着这个编程示例系列文章的发表,迄今已发布了 14 次小升级,下载地址: http://code.google.com/p/muduo/downloads/list
接下来,我还会写一系列博客,目前想到的有:
另外,我会逐步把已有的博客文章整理成 PDF 合集,方便下载保存,地址是: http://blog.csdn.net/Solstice/archive/2011/02/24/6206154.aspx