之前写过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/

转载于:https://www.cnblogs.com/ibaiyang/archive/2012/12/07/2807349.html

#架构#重新设计socks5代理代码框架相关推荐

  1. 猜谜游戏、彩云词典爬虫、SOCKS5代理的 Go(Golang) 小实践,附带全代码解释

    猜谜游戏在编程语言实践都已经和 HelloWord 程序成为必不可少的新手实践环节,毕竟,它能够让我们基本熟悉 for 循环.变量定义.打印.if else 语句等等的使用,当我们基本熟悉该语言基础之 ...

  2. 实战:150行Go实现高性能socks5代理

    光说不练假把式,不如上手试试,这篇来写个有点卵用的东西. - TCP Server - 用 Go 实现一个 TCP Server 实在是太简单了,什么 c10k problem.select.poll ...

  3. golang 使用 http socks5 代理

    目录 第一种方法: HTTP(S)代理 第二种方法: Socket5代理 第一种方法: HTTP(S)代理 代码实现如下: package mainimport ("fmt"&qu ...

  4. 穿透Socks5 代理的UDP编程

    网络编程中,对于数据传输实时性要求较高的场合,大家都会选择UDP来作为数据传输协议,在TCP/IP协议族中UDP协议较TCP协议需要的网络系统资源更少.然而在企业应用中,由于网络安全原因等会导致除了特 ...

  5. 白色flash模块代码_适用于MCU项目的代码框架BabyOS,工程师的好助手!

    来源:码云+嵌入式云IOT技术圈 一个好的代码架构直接影响项目的质量,今天为大家分享的是一个管理功能模块和外设驱动的框架:BabyOS. BabyOS是什么? BabyOS适用于MCU项目,它是一套管 ...

  6. 十年 IT 老兵带你通过案例学架构,附C#代码

    技术大会上的分享大多高大上,亿级流量.超大型研发团队,虽然值得借鉴,但由于应用场景与研发资源的差异,一般企业并不容易落地.其实,中小型研发团队在IT行业还是占大多数,他们在技术架构方面的问题较多,技术 ...

  7. 前端架构设计1:代码核心

    现在的前端领域, 随着JS框架, UI框架和各种库的丰富, 前端架构也变得十分的重要. 如果一个大型项目没有合理的前端架构设计, 那么前端代码可能因为不同的开发人员随意的引入各种库和UI框架, 导致代 ...

  8. ASoC Platform驱动代码框架图

    原址 [前言] 在更深入地阅读了工程中 Audio 部分的驱动代码之后,整理出了一个 ASoC Platform 驱动代码的框架图.类似的 ASoC Machine驱动代码框架图在<ASoC M ...

  9. ASoC Machine驱动代码框架图

    原址 [前言] 较久之前写了一篇<Linux ASoC音频驱动架构 及 Machine驱动代码分析>,那个时候刚开始接触 ALSA,文章写得很粗糙.这段时间以来新看了 HAL层.Frame ...

最新文章

  1. 用REDIS实现分布式缓存
  2. 第二次Soring冲刺计划第二天(个人)
  3. 怎么理解python语言_Python语言入门1-理解Python语言
  4. 天玑720支持鸿蒙系统吗,天玑720属于骁龙多少 天玑720处理器相当于骁龙几
  5. Binary classification - 聊聊评价指标的那些事儿【回忆篇】
  6. C 库函数 - pow()
  7. python3 os.system 异步执行_《sentos python教程》 Python os.system(command),这样执行的command命令,和主程序是异步的吗?...
  8. 在xcode中用oc实现计算器
  9. linux系统源码文档,Linux操作系统源代码详细分析
  10. Windows Server 2008安装nodejs
  11. 三角函数和角与差角公式的图形解释
  12. 浏览器打开页面的几种方式
  13. Description: Field smsClient in com.atguigu.gmall.pms.service.impl.SpuServiceImpl required a bean o
  14. 十大重要IT公司排名 -2009
  15. 项目二 管理与维护Linux系统
  16. yuque-hexo:语雀写文,自动部署 Hexo 博客
  17. c#进行excel编辑
  18. 支付宝沙箱开启以及配置
  19. 正则表达式 语法详解
  20. artemis服务_集成Artemis

热门文章

  1. 为什么使用pickle模块
  2. Python条件判断和循环,range()函数
  3. Flume的Collector
  4. gradient杂谈
  5. Visual C++ 菜单
  6. Delphi绘制Alpha图像的函数
  7. JAVA单向/双向链表的实现
  8. facebook 分享,遇到的错误
  9. Linux系统下的数据镜像备份工具——Rsync
  10. Nginx+Firebug 让浏览器告诉你负载均衡将请求分到了哪台服务器