#架构#重新设计socks5代理代码框架

之前写过socks5代理,具体请看这篇文章

在写任何代码代码之前,一直认为只有设计好了相应的数据结构,才能写好好的算法和框架。从前面的代码来看,对socks5协议的数据结构定义还算不错,具有很好的可读性。正如之前所说,前面版本太过于简单,虽然是基于多线程,但是性能上并不是很好,因为我要对每一个请求临时创建一个线程,我们都知道创建新线程,是需要额外的系统资源,假如有很多Request请求时,过多的开辟线程,可能导致资源耗尽而宕机。

再者,前面的版本没有很好的处理TCP状态,在linux下通过netstat状态查看,有部分socket套接字处于CLOSE_WAIT状态,其意思是在没有数据发出时,服务器端没有主动关闭Socket。

今天,重新设计了一下socks5服务器的框架。

主要设计思想如下:

维护三个队列:Wait_Queue,Ready_Queue和Read_Queue,分别用于存储刚接收到请求的套接字,用于Select函数处理的套接字和有数据到达的套接字;

线程A里,有一个循环,不断地接受来自客户端的请求,将产生的socket压入Wait_Queue;

线程B里,也有一个循环,不断地Select或epoll Ready_Queue里的套接字,然后将有数据可读的套接字(看是否对方已经关闭)压入Read_Queue;

线程组C里,可以利用多线程处理Read_Queue,线程组大小可以开设定,程序运行时就开辟相应的线程数量,这样以后就不会为每个请求开辟线程了;

其中,线程B和线程组C是生产消费模型;即Read_Queue大小不为0时,线程组就会进行处理数据;当Read_Queue大小为0后,线程B又会从新更新Read_Queue的值。

要注意的是,这里涉及到很多数据同步的问题,所以需要用到Mutex,生产消费模型需要pthread_cond_t。

来,我们验证这个框架的性能吧,敬请期待。

最后,我用python写了一下这个框架,请看我的github lab,后面还对这个框架进一步说明。

 

-----------------打造高质量的文章 更多关注 把酒泯恩仇---------------

为了打造高质量的文章,请赞一个吧。。。。谢谢了,我会写更多的好文章的。

请关注sina微博:http://weibo.com/baiyang26

把酒泯恩仇官方博客:http://www.ibaiyang.org 【推荐用google reader订阅】

把酒泯恩仇官方豆瓣:http://www.douban.com/people/baiyang26/

posted @ 2012-12-07 15:21  把酒泯恩仇  阅读(321)  评论(0编辑  收藏  举报