#架构#重新设计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/
轉載于:https://www.cnblogs.com/ibaiyang/archive/2012/12/07/2807349.html
總結
以上是生活随笔為你收集整理的#架构#重新设计socks5代理代码框架的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 从30岁到35岁:为你的生命多积累一些厚
- 下一篇: 建一所希望小学需要600万!