SS5 代理服務器
SS5 是一款linux 下的代理工具,支持SOCKS
V4
和
SOCKS V5
。官網 介紹說,它支持telnet、ftp、finger、 whois、gohper和 WWW。
Windows 下的糾結
這麼好的一個開源代理軟件只有linux版,並沒有windows版,可能出於某種方面的考慮吧。在面對windows版的需求,我想到第一個就是拿它放到 cygwin 下去編譯,發現總是編譯不過去,SSL庫不支持。對於只要其代理功能的我,看了一遍它的代碼,發現其用很多宏,再往深的看發現對於核心代理功能模塊並沒有特殊的代碼,決定自己來移植吧。
Windows 下的移植
對於要移植的代碼,最好的就是大面積複用以前的代碼,保證功能代碼不變。對於此,首先我們就要自己寫個入口,作爲服務, 你當然也得寫成 windows 服務的模式。
#if SERVICEMODE
void main()
{
SERVICE_TABLE_ENTRY ServiceTable[2];
ServiceTable[0].lpServiceName = "Socks Server 5";
ServiceTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain;
ServiceTable[1].lpServiceName = NULL;
ServiceTable[1].lpServiceProc = NULL;
StartServiceCtrlDispatcher(ServiceTable);
}
void ServiceMain(int argc, char** argv)
#else
int main(int argc, char **argv, char **envp)
#endif
這裏我用一個宏來區分服務模式和調試模式,當然這裏最好是用參數來代替,但當初時間緊就沒加,不過思路是一樣的。對於 windows 的service 程序必須得加些 Service要的東西。
下面就是socket 相關的,但這個不分平臺的,只是包含的頭文件路徑不同而已。再往下就遇到了fork
,這個linux
下特色函數,在windows 下也就只有線程來模擬。涉及到線程,如果使用 windows 下自帶的線程,那移植的代碼量就太多了。網上搜了下,發現
pthread
有 windows 版,果斷下下來就pthread
,自己平時都是寫 linux 下的程序,所以pthread
用起來還是蠻親切的。
再添加核心功能代碼,這個也是特別煩,就那麼幾個文件,看其代碼量驚人,但因本人只需要其 Socks v5 的部分,剔掉好多代碼,就會發現其代碼量並不多。
核心代碼理解
對於實現 socks協議的部分我就不多說了,這個可以直接看文檔,我只說說ss5代理 是怎麼實現的。主要部分一共三個 socket,一個socket 負責發 socks 協議指令的,一個負責與客戶端傳輸數據,最後一個負責遠端請求的。SS5ProxyData
則是數據交換的中心,剩下的好像也沒什麼難的了,如果有不理解的地方,請發評論,我會及時解答。
發佈
寫好程序要發佈,這裏我使用的是Advanced Installer
,把安裝軟件配置成服務類的程序,再簡單的給安裝包添加些信息。好了,一個
windows 版 ss5 就出爐了。
結束語
因爲代碼涉及些特殊業務,就不公佈太多了,這裏主要談下思路。寫代碼最重要的是思路,你要是真編碼起來,其實並不難。最後再囉嗦兩句,一般說到移植,人們都會想到大量的代碼工作,我也有過畏卻,但最後狠下心來做的時候,發現也就so so 了,所以在代碼界混的人,要有強大的動手能力,這樣才能把自己的基本功練紮實。