SS5 windows移植

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 了,所以在代碼界混的人,要有強大的動手能力,這樣才能把自己的基本功練紮實。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章