




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、P2P bot的原理及客戶端端模塊的設計與實現(xiàn) 內容摘要:僵尸網絡是一種從傳統(tǒng)惡意代碼形態(tài)進化而來的新型攻擊方式,為攻擊者提供了隱匿、靈活且高效的一對多命令與控制機制,可以控制大量僵尸主機實現(xiàn)信息竊取、分布式拒絕服務攻擊和垃圾郵件發(fā)送等攻擊目的.僵尸網絡正步入快速發(fā)展期,對因特網安全已造成嚴重威脅,對中國大陸造成的危害尤為嚴重.本文介紹了僵尸網絡的演化過程和基本定義??蛻舳耸荘2P Botnet的bot程序重要的組成部分,本文詳細介紹了客戶端主要功能模塊及各模塊之間的運行關系。闡述了客戶端工作流程及相關的關鍵數據結構。開發(fā)中利用了計算機網絡編程的基本理論知識。經過分析這些情況,該客戶端采用Mi
2、crosoft Visual C+ 6.0為基本開發(fā)環(huán)境。關鍵字: 網絡安全;僵尸網絡;客戶端Abstract:Botnet is a novel attack strategy evolved from traditional malware forms; it provides the attackers stealthy, flexible and efficient one-to-many Command and Control mechanisms, which can be used to order an army of zombies to achieve the goals
3、including information theft, launching distributed denial of service, and sending spam. Botnet has stepped into the expanding phase, and has been a serious threat to Internet security, especially in China mainland. In this paper, the evolution process, concept .The Client is the most important cente
4、r of partially P2P Botnet. The primary functions and the relation of them are introduced in detail.Keywords:network security; botnet; peer-to-peer目 錄1引言11.1 國內外研究背景資料.12 C+語言及系統(tǒng)開發(fā)工具簡介12.1 C+語言的由來22.2 C+語言的發(fā)展22.3 C+語言的特點22.4 系統(tǒng)開發(fā)工具33 系統(tǒng)描述43.1 選課來源43.2 P2P協(xié)議常識43.3 P2P bot的原理43.4 需求分析53.5 系統(tǒng)功能模塊概述53.5.
5、1 客戶端53.5.2 服務器端 . 54 P2P bot客戶端總體設計64.1 系統(tǒng)運行環(huán)境64.1.1 硬件環(huán)境. 64.1.2 軟件環(huán)境. 64.2 客戶端與服務器端功能原理的實現(xiàn)84.3 系統(tǒng)實現(xiàn)原理 . 95 詳細設計95.1 客戶端程序編寫105.1.1 客戶端程序105.1.2 客戶端執(zhí)行程序. 125.1.3 服務器監(jiān)聽程序185.2 功能測試. 236結束語24參考文獻25P2P bot的原理及客戶端端模塊的設計與實現(xiàn)客戶端1 引言1.1 國內外研究背景資料僵尸網絡是近年來興起的危害互聯(lián)網的重大安全威脅之一,攻擊者通過各種途徑傳播僵尸程序感染互聯(lián)網上的大量主機,而被感染的主機
6、將通過一個控制信道接收攻擊者的指令,組成一個僵尸網絡。大部分的僵尸網絡都可以在攻擊者的控制下進行進一步的傳播,從而使得僵尸網絡的規(guī)模越來越龐大。一旦攻擊者擁有一定規(guī)模的僵尸網絡,就可以利用僵尸網絡所控制的資源,在互聯(lián)網上建立起了一種強勢地位,并且可以利用這些資源獲取經濟利益。僵尸網絡的危害主要體現(xiàn)在發(fā)動分布式拒絕服務攻擊、發(fā)送垃圾郵件以及竊取僵尸主機內的敏感信息等。研究顯示全世界接入因特網的計算機中大約有40%被感染了僵尸程序(bot),并受攻擊者控制。基于P2P協(xié)議的半分布式僵尸網絡(Partially Decentralized P2P Botnet )已經成為網絡安全研究人員關注的焦點。
7、由于P2P網絡中每個節(jié)點是對等的,即使移除半分布式P2P 僵尸網絡中的一個或者幾個中心bot節(jié)點或一批非中心bot節(jié)點,對整個僵尸網絡不會造成致命的影響;半分布式P2P僵尸網絡的控制方式采用分布式的控制,各個bot之間的通信流量隱藏在了大量的正常P2P通信流量下。這些特點使得半分布式P2P僵尸網絡具有更好的安全性,隱秘性和魯棒性。這給半分布式P2P僵尸網絡的發(fā)現(xiàn)、跟蹤和控制帶來了巨大的挑戰(zhàn)。目前,國內外對半分布式P2P Botnet的研究仍然處于初級階段,還未給出通用的檢測方法。要檢測和跟蹤半分布式P2P Botnet,需了解它的控制機制和運行原理。本文概要介紹了Botnet技術,分析了基于P
8、2P 技術的Botnet 的特點并研究在基于P2P協(xié)議機制的bot程序中,客戶端所扮演的角色。2 C+語言及系統(tǒng)開發(fā)工具簡介2.1 C+語言的由來C+是從C語言發(fā)展演變而來的一種面向對象的程序設計語言。貝爾實驗室的本賈尼·斯特勞斯特盧普(w:en:Bjarne Stroustrup)博士在20世紀80年代發(fā)明并實現(xiàn)了C+(最初這種語言被稱作“C with Classes”)。C+是作為C語言的增強版出現(xiàn)的,從給C語言增加類開始,不斷的增加新特性。2.2 C+語言的發(fā)展C+語言發(fā)展大概可以分為三個階段:第一階段從80年代到1995年。這一階段C+語言基本上是傳統(tǒng)類型上的面向對象語言,并
9、且憑借著接近C語言的效率,在工業(yè)界使用的開發(fā)語言中占據了相當大份額;第二階段從1995年到2000年,這一階段由于標準模板庫(STL)和后來的Boost等程序庫的出現(xiàn),泛型程序設計在C+中占據了越來越多的比重性。當然,同時由于Java、C#等語言的出現(xiàn)和硬件價格的大規(guī)模下降,C+受到了一定的沖擊;第三階段從2000年至今,由于以Loki、MPL等程序庫為代表的產生式編程和模板元編程的出現(xiàn),C+出現(xiàn)了發(fā)展歷史上又一個新的高峰,這些新技術的出現(xiàn)以及和原有技術的融合,使C+已經成為當今主流程序設計語言中最復雜的一員。2.3 C+語言的特點C+的主要特點表現(xiàn)在兩個方面,一是全面兼容C,二十支持面向對象
10、的方法。面向對象的程序設計方法將數據及對數據的操作方法封裝在一起座位一個相互依存、不可分離的整體對象。對同類型對象抽象出氣共性,形成類。類中的大多數數據,只能用本類的方法進行處理。類通過一個簡單的外部皆可,與外界發(fā)生關系,對象與對象之間通過消息進行通信。這樣,程序模塊間的關系簡單,程序模塊的獨立性,數據的安全性具有良好的保障。同時,通過繼承與多態(tài)性,使程序具有很高的可重用性,是的軟件的開發(fā)和維護都更為方便。由于面向對象方法的突出優(yōu)點,目前它已經成為開發(fā)大型軟件才用的主要方法,而C+語言是應用最廣泛的面向對象的程序設計語言之一。2.4 系統(tǒng)開發(fā)工具Microsoft Visual C+ 6.0
11、簡介Visual C+是一個功能強大的可視化軟件開發(fā)工具。自1993年Microsoft公司推出Visual C+1.0后,隨著其新版本的不斷問世,Visual C+已成為專業(yè)程序員進行軟件開發(fā)的首選工具。雖然微軟公司推出了Visual C+.NET(Visual C+7.0),但它的應用的很大的局限性,只適用于Windows 2000,Windows XP和Windows NT4.0。所以實際中,更多的是以Visual C+6.0為平臺。Visual C+6.0不僅是一個C+編譯器,而且是一個基于Windows操作系統(tǒng)的可視化集成開發(fā)環(huán)境(integrated development env
12、ironment,IDE)。Visual C+6.0由許多組件組成,包括編輯器、調試器以及程序向導AppWizard、類向導Class Wizard等開發(fā)工具。 這些組件通過一個名為Developer Studio的組件集成為和諧的開發(fā)環(huán)境。Visual C+它大概可以分成三個主要的部分:1 Developer Studio,這是一個集成開發(fā)環(huán)境,我們日常工作的99%都是在它上面完成的,再加上它的標題赫然寫著“Microsoft Visual C+”,所以很多人理所當然的認為,那就是Visual C+了。其實不然,雖然Developer Studio提供了一個很好的編輯器和很多Wizard,但
13、實際上它沒有任何編譯和鏈接程序的功能,真正完成這些工作的幕后英雄后面會介紹。我們也知道,Developer Studio并不是專門用于VC的,它也同樣用于VB,VJ,VID等Visual Studio家族的其他同胞兄弟。所以不要把Developer Studio當成Visual C+, 它充其量只是Visual C+的一個殼子而已。這一點請切記!2 MFC。從理論上來講,MFC也不是專用于Visual C+,Borland C+,C+Builder和Symantec C+同樣可以處理MFC。同時,用Visual C+編寫代碼也并不意味著一定要用MFC,只要愿意,用Visual C+來編寫SDK
14、程序,或者使用STL,ATL,一樣沒有限制。不過,Visual C+本來就是為MFC打造的,Visual C+中的許多特征和語言擴展也是為MFC而設計的,所以用Visual C+而不用MFC就等于拋棄了Visual C+中很大的一部分功能。但是,Visual C+也不等于MFC。3 Platform SDK。這才是Visual C+和整個Visual Studio的精華和靈魂,雖然我們很少能直接接觸到它。大致說來,Platform SDK是以Microsoft C/C+編譯器為核心(不是Visual C+,看清楚了),配合MASM,輔以其他一些工具和文檔資料。上面說到Developer Stu
15、dio沒有編譯程序的功能,那么這項工作是由誰來完成的呢?是CL,是NMAKE,和其他許許多多命令行程序,這些我們看不到的程序才是構成Visual Studio的基石。3 系統(tǒng)描述3.1 選課來源根據當前網絡的發(fā)展,網絡安全越來越受各種網民所關注?;赑2P協(xié)議的僵尸網絡(Partially Decentralized P2P Botnet )也已經成為網絡安全研究人員關注的焦點。因此作為網絡中的一員對起進行研究和探討也是是有必要,通過研P2P bot的原理使我們可以更加了解網絡安全的必要性。而且對我們在今后參與到網絡中也有著很大的幫助。而本人也學習過C+語言,對網絡編程和網絡安全也較有興趣,為
16、了更好的考驗自己對C+語言以及網絡知識方面的掌握程度,本人就決定以P2P bot的原理及客戶端端模設計與實現(xiàn)為畢業(yè)設計,希望通過這一次的畢業(yè)設計發(fā)現(xiàn)自己在專業(yè)知識方面的欠缺,然后進一步提高本人的網絡開發(fā)編程的能力。3.2 P2P協(xié)議常識P2P是peer-to-peer的縮寫,peer在英語里有"(地位、能力等)同等者"、"同事"和"伙伴"等意義。這樣一來,P2P也就可以理解為"伙伴對伙伴"的意思,或稱為對等聯(lián)網。利用P2P技術,計算機之間可以進行直接交互,而不需要使用任何一臺中央服務器。而且由于大部分處理直接在節(jié)點
17、之間進行,減少了對服務器的依賴,具有很好的可擴展性。目前,P2P技術已經應用于很多領域,如:文件共享、即時通訊、協(xié)同工作、分布式計算、電子商務、網絡游戲以及信息檢索等方面,其中網絡文件共享應用最為廣泛。3.3 P2P bot的原理Servent bots (服務節(jié)點或超級節(jié)點):是僵尸網絡控制者(botmaster)從僵尸網絡中選擇的,性能和安全性能比較好的受控主機來做為服務節(jié)點(一般選擇靜態(tài)IP的主機)。服務節(jié)點(servent bots)類似于一個服務器,但又包含了Client bots 的功能,可以對接收到的指令進行轉發(fā)、處理,它可以主動連接其它的服務節(jié)點,同時也接受客戶節(jié)點(Clien
18、t bots)和其它服務節(jié)點的連接。Client bots(客戶節(jié)點):它也是受控的主機(一般為動態(tài))。它能主動的周期性的連接Servent bots 。在這兩種節(jié)點(即每臺受控主機)中都存有一張有限的鄰接的服務節(jié)點的鏈表(peer list),鏈表中有服務節(jié)點的IP地址,但并不包括客戶節(jié)點的IP (因為客戶節(jié)點一般都有動態(tài)的IP)。根據節(jié)點在整個僵尸網絡中的地位和作用不同,將所有的節(jié)點分為了兩類:servent bot節(jié)點 和client bot節(jié)點。半分布式P2P botnet所有的節(jié)點均部署統(tǒng)一的、基于P2P協(xié)議機制的bot程序。Bot 程序包含客戶端程序、控制服務器程序和指令功能實施模
19、塊三個部分。Client bot 僅啟動客戶端程序,servent bot既啟動客戶端程序又啟動控制服務器程序。3.4 需求分析要測試運行P2P bot客戶端,我們還需要服務器端。首先來看一下客戶端的任務: 客戶端能主動連接服務器端Servent bots ,并向服務器端發(fā)送消息。服務器應該完成的工作包括:1. 服務器與客戶端建立連接。 2. 接收來自客戶端的信息,接收到的信息如果為認證信息,判斷其是否通過認證。相對服務器而言,客戶端的任務較為簡單,有了以上的簡單分析,可以知道,解決上述幾個問題,即完成了該P2P bot客戶端的核心任務。3.5 系統(tǒng)功能模塊概述3.5.1 客戶端Client
20、bots(客戶節(jié)點):它也是受控的主機(一般為動態(tài))。它能主動的周期性的連接Servent bots 。3.5.2 服務器端Servent bots (服務節(jié)點或超級節(jié)點):是僵尸網絡控制者(botmaster)從僵尸網絡中選擇的,性能和安全性能比較好的受控主機來做為服務節(jié)點(一般選擇靜態(tài)IP的主機)。服務節(jié)點(servent bots)類似于一個服務器,但又包含了Client bots 的功能,可以對接收到的指令進行轉發(fā)、處理,它可以主動連接其它的服務節(jié)點,同時也接受客戶節(jié)點(Client bots)和其它服務節(jié)點的連接。4 P2P bot客戶端總體設計客戶端與服務器端建立的連接圖:4.1.
21、1硬件環(huán)境A. 具有奔騰4、64兆內存和顯存配置以上的計算機。B. Microsoft鼠標或其它兼容鼠標。C. 最少500MB的硬盤空間,常規(guī)安裝需要500MB硬盤空間,完全安裝需要1G硬盤空間。 D. WindowsXP中文版更高。E. VGA顯示器或更高。4.1.1軟件環(huán)境使用4臺主機作為測試對象。其中3臺主機作為服務器節(jié)點,1臺主機作為客戶端節(jié)點。4臺主機中分別植入了半分布式的P2P bot程序,在局域網內。4.1 客戶端與服務器端功能原理的實現(xiàn) 服務器與客戶端建立連接之后,處理接收信息的控制流程如圖2所示。 圖21、服務器與客戶端建立連接,并創(chuàng)建相應的套接字對象。利用套接字對象集合存儲
22、新的套接字對象。這樣,一條連接對應了一個套接字對象(如圖2)。2、接收來自客戶端的信息。接收到的信息如果為認證信息,判斷其是否通過認證:1通過認證,則將返回該服務器的認證信息到源bot。并判斷該連接是否已經斷開,如果沒有,繼續(xù)接收來自客戶端的信息。2沒有通過認證,將直接斷開與客戶端的連接。3、接收到非認證信息,判斷是否為其它bot的id號(通過m_bid標志判斷)。如果是,則交換該bot的id號,將該id號發(fā)送回源bot。如果為其它的指令,交由解析指令模塊執(zhí)行。4、對解析出來的指令,判斷該指令是否為反饋信息。如果為反饋信息,則根據源地址將該反饋信息返回給源bot。如果為bot的執(zhí)行指令,交由b
23、ot的處理指令模塊進行處理。5、判斷客戶端和服務器的連接是否斷開。斷開則關閉套接字、清除套接字對象。l服務器線程處理一條連接完成。bot主程序仍在運行,服務器繼續(xù)監(jiān)聽;主程序已經終止,則終止服務器程序。4. 2 系統(tǒng)實現(xiàn)原理botmasterServent botsClient bots節(jié)點2節(jié)點1節(jié)點3節(jié)點4節(jié)點5P2P bot 工作的原理圖31、控制者(botmaster)用私鑰登陸到已知的服務節(jié)點(Servent bots)中的任何一個節(jié)點,并向該臺服務節(jié)點(Servent bots)發(fā)送指令(如圖的所示)。2、服務節(jié)點收到指令后,與該臺主機的bot 中所存儲的接收到的指令(每條指令都有
24、一個ID)比較,如果這條指令已接收過,則不處理這條指令。如果這條指令從未接收過,那么服務節(jié)點根據peer list 中的服務節(jié)點的IP 將這條指令轉發(fā)給peer list 中的所有服務節(jié)點(Servent bots)。同時該臺主機也要處理該條指令。(如圖中的所示)3、其它的服務節(jié)點(Servent bots)周期性的主動連接其peer list 中的服務節(jié)點(Servent bots)(如上圖所示的節(jié)點2主動連接節(jié)點1、節(jié)點3主動連接節(jié)點4),一旦建立連接,節(jié)點2向節(jié)點1發(fā)送一個探測包,要求將最近收到的一條指令發(fā)送過來。節(jié)點1收到探測包后,向節(jié)點2 發(fā)送最近的一條指令(如圖中的所示)。4、節(jié)點
25、(所有bots)接收到指令后,也要判斷是否接收過此條指令。如果在指令鏈表中已有此條指令,將不做任何處理;如果沒有,則將此條指令轉發(fā)給該bot 的peer list 中的所有服務節(jié)點(Servent bots)(如圖中所示),再重復步驟2。同時該主機分析處理這條指令。5 詳細設計5.1 客戶端程序編寫5.1.1 客戶端程序 建立客戶端建立客戶端程序并對發(fā)送的數據先加密,用公鑰加密數據msg相關代碼如下:void CClient:Cmd_Forward(CString &cmd, bool cmd_reply, CThread *object)/用本服務器(bot)的對稱密鑰
26、加密數據再發(fā)送Cmd_Forward(cmd.Str(), cmd_reply, object);void CClient:Cmd_Forward(char *cmd, bool cmd_reply, CThread *object)/用本服務器(bot)的對稱密鑰加密數據再發(fā)送if (cmd_reply)Thread_mutex.Lock();list<CThread *>:iterator it;for (it=m_CLientitemThread.begin(); it!=m_CLientitemThread.end(); +it)if (*it != object)/注意要
27、先加密 (CClientItem *)(*it)->SendMsg(cmd,true);Thread_mutex.Unlock();elseCClientItem *to_object = (CClientItem*)object;to_object->SendMsg(cmd,true); void CClient:SendReply(CString &msg, CMessage *pMsg)/用公鑰加密msg 要反饋的信息;char buff1000;memset(buff, 0,sizeof(buff);memcpy(buff, msg.Str(), msg.GetLe
28、ngth();CString reply;reply.Format("%d %d %s %s %s*%s", 2, 20, g_cMainCtrl.m_cBot.bot_id.sValue.Str(), pMsg->sReplyTo.Str(), pMsg->sIdentd.Str(), buff);g_cMainCtrl.m_cConsDbg.Log(4, "客戶端要反饋的信息:%sn", reply.Str();list<CThread*>:iterator it;for (it=m_CLientitemThread.begi
29、n(); it!=m_CLientitemThread.end(); +it)CClientItem *item = (CClientItem*)(*it);if (item->same(pMsg->sReplyTo)item->SendMsg(reply.Str(), true); break;/一般只有一條,所以停止查找void CClient:SendReply(char *msg, CMessage *pMsg)CString in_msg(msg);SendReply(in_msg, pMsg);void CClient:SendReply(CString &
30、;msg, CString &sReplyTo, CString &sIdentd, bool &type)/用公鑰加密msg 要反饋的信息;char buff1000;memset(buff, 0,sizeof(buff);memcpy(buff, msg.Str(), msg.GetLength();CString reply;reply.Format("%d %d %s %s %s*%s", 2, 20, g_cMainCtrl.m_cBot.bot_id.sValue.Str(), sReplyTo.Str(), sIdentd.Str(),
31、 buff);g_cMainCtrl.m_cConsDbg.Log(4, "客戶端要反饋的信息:%sn", reply);list<CThread*>:iterator it;for (it=m_CLientitemThread.begin(); it!=m_CLientitemThread.end(); +it)CClientItem *item = (CClientItem*)(*it);if (item->same(sReplyTo)item->SendMsg(reply.Str(), true); break;/一般只有一條,所以停止查找5.
32、1.2 客戶端執(zhí)行程序 與服務器建立連接客戶端與服務器端進行連接,發(fā)送數據。 相關代碼如下: #ifdef DBGCONSOLEg_cMainCtrl.m_cConsDbg.Log(4,"CClient(0x%8.8Xh):Trying to connect to "%s:%d".n", this, (*it)->si_serverip.sValue.CStr(), (*it)->si_port.iValue);#endif/連接服務器/ Setup vars, resolve addressSOCKET m_sSocket;s
33、ockaddr_in ssin;int iErr; /memset(&ssin, 0, sizeof(ssin);ssin.sin_family=AF_INET;ssin.sin_port=htons(*it)->si_port.iValue);ssin.sin_addr.s_addr=ResolveAddress(*it)->si_serverip.sValue).Str();m_sSocket = socket(AF_INET,SOCK_STREAM,0);if (m_sSocket = SOCKET_ERROR) continue; #ifdef DBGCONSOLE
34、 g_cMainCtrl.m_cConsDbg.Log(4, "Client(0x%8.8Xh): Resolved "%s" to "%s".n", this,(*it)->si_serverip.sValue.CStr(),inet_ntoa(to_in_addr(ssin.sin_addr.s_addr); #endifiErr=connect(m_sSocket, (sockaddr*)&ssin, sizeof(ssin);/連接服務器if(iErr=SOCKET_ERROR) / Connect failed
35、, exit #ifdef DBGCONSOLE g_cMainCtrl.m_cConsDbg.Log(4, "CClient(0x%8.8Xh): Connection to "%s:%d" failed!n", this, (*it)->si_serverip.sValue.CStr(), (*it)->si_port.iValue); #endifSleep(10000);continue;else / Connection established#ifdef DBGCONSOLE g_cMainCtrl.m_cConsDbg.Log(
36、3, "CClient(0x%8.8Xh): Connection to "%s:%d" established!n",this,(*it)->si_serverip.sValue.CStr(),(*it)->si_port.iValue);#endif (*it)->si_connect.bValue = true;/建立連接線程,因為一個連接一個線程CClientItem *m_Clientitem = new CClientItem(m_sSocket,(*it)->si_key.sValue.CStr(),this, (*
37、it)->si_serverip.sValue); /如果有初始化,就先進行初始化,可以在對象里寫一個初始化的函數 如m_Clientitem.init();m_CLientitemThread.push_back(m_Clientitem);/啟動線程m_Clientitem->Start(); /連接相應的服務器Sleep(10000); /休息一段時間,再繼續(xù)連接服務器,可停頓較長的時間return NULL; 連接服務器后接受信息當客戶端建立與服務器端的連接后,服務器接受信息,開始時要進行一些信息的必要交換,然后對數據進行解密,然后判斷是否通過認證消息。 相
38、關代碼如下:void *CClientItem:Run()/服務器已經連接上了,可以接收消息了,也可以接收消息了,開始時要進行一些信息的必要交換Sleep(1000);m_des.SetDeskey(key);if (!m_Certification)unsigned char buf200="p2pnet"int len=120;/memcpy(buf,"p2pnet0",len+1);/對它加密然后再發(fā)出去unsigned char output200;memset(output,0,200);int encrypt = 1;m_des.des(ou
39、tput,buf, encrypt);encrypt = 0;unsigned char output1200;m_des.des(output1,output,encrypt);int length =strlen(char *)output);if (SendMsg(char *)output, false)g_cMainCtrl.m_cConsDbg.Log(4, "認識口令已經發(fā)送n");else m_bRunning = false;closesocket(m_sSocket);char szLine100;memset(szLine, 0, 100);bool
40、bRecvd=false;if (!Receive(szLine, sizeof(szLine)/recv(m_sSocket, szLine, 100, 0) = SOCKET_ERRORm_bRunning = false;closesocket(m_sSocket);int i= strlen(szLine);szLinestrlen(szLine)+1='0'if (!strcmp(szLine,"agree")g_cMainCtrl.m_cConsDbg.Log(4, "有一條到服務器的連接已經通過認證n");m_Certifi
41、cation= true;elseg_cMainCtrl.m_cConsDbg.Log(4, "有一條到服務器的連接沒有通過認證n"); bool CClientItem:SendRaw(char *szMsg)if(g_cMainCtrl.m_cBot.si_usessl.bValue)if(m_csslSocket.Write(szMsg, strlen(szMsg) <= strlen(szMsg)m_bRunning = false;xClose(m_sSocket);m_client->DeleteThread(this);return false;e
42、lsereturn true; elseint length = xWrite(m_sSocket, szMsg, strlen(szMsg),0);if( length < strlen(szMsg)m_bRunning = false;xClose(m_sSocket);m_client->DeleteThread(this);return false; else g_cMainCtrl.m_cConsDbg.Log(2, "客戶端發(fā)送信息成功n");return true; bool CClientItem:Receive(char *szBuffer,
43、int iBufSize)int iRead=0;iRead = xRead(m_sSocket, szBuffer, 1000);if(!iRead | iRead=-1)if(ERRNO!=EWOULDBLOCK) return false;szBufferstrlen(szBuffer)-1 = '0'if (szBufferstrlen(szBuffer)-1 = 'n')szBufferstrlen(szBuffer)-1 = '0'g_cMainCtrl.m_cConsDbg.Log(2, "客戶端收到的信息:%sn&quo
44、t;, szBuffer);return true; bool CClientItem:SendMsg(char *szMsg, bool is)if (is) /如果為真要先加密然后再發(fā)送char szline1000;memset(szline, 0, 1000);m_des.des(unsigned char*)szline, (unsigned char*)szMsg, 1);szlinestrlen(szline) = 'n' return SendRaw(szline);elseszMsgstrlen(szMsg) = 'n'return SendR
45、aw(szMsg);bool CClientItem:same(CString &botid)g_cMainCtrl.m_cConsDbg.Log(2, "客戶端的比較:%sn%sn", m_serverid.Str(), botid.Str();if ( !m_serverid.Compare(botid) return true;return false;CClientItem* CClientItem:FinBot(char *m_source) /應該是根據指令Id,來查找它的來源CString botid(m_source);list<CThread
46、*>:iterator it; for(it=m_client->m_CLientitemThread.begin(); it!=m_client->m_CLientitemThread.end(); +it)CClientItem *item = (CClientItem*)(*it);if (!(item->m_serverid).Compare(botid)return item; return NULL;5.1.3 服務器監(jiān)聽程序當客戶端與服務器端進行連接時,服務器進行監(jiān)聽。具體來說有以下幾個步驟:創(chuàng)建監(jiān)聽套接字、綁定套接字、偵聽、連接、發(fā)送接收數據、關閉。相關
47、代碼如下:void *CListerServer:Run() /創(chuàng)建監(jiān)聽套接字SOCKET SListen;Socket_Obj *pSockobj = NULL; SOCKET Accept = INVALID_SOCKET; SOCKADDR_IN ServerAddr;SListen = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); if(SListen = INVALID_SOCKET) g_cMainCtrl.m_cConsDbg.Log(10,"Listen create failed!"); /綁定int ret ;do S
48、erverAddr.sin_family = AF_INET;ServerAddr.sin_addr.s_addr = htonl(INADDR_ANY);u_short port = (u_short)(g_cMainCtrl.m_cBot.bot_lister_port.iValue);ServerAddr.sin_port = ntohs(port);/need set#ifdef DBGCONSOLE g_cMainCtrl.m_cConsDbg.Log(4,"cbot(0x%8.8Xh): Trying to connect to "%s:%d".n&q
49、uot;, this,g_cMainCtrl.m_cBot.m_p2pserver->si_serverip.sValue.CStr(), g_cMainCtrl.m_cBot.m_p2pserver->si_port.iValue);#endif ret = bind(SListen,(sockaddr*)&ServerAddr,sizeof(SOCKADDR_IN);if(ret = SOCKET_ERROR)g_cMainCtrl.m_cConsDbg.Log(10,"bind failed!");closesocket(SListen); whi
50、le(ret = SOCKET_ERROR);/監(jiān)聽 listen(SListen,20);FD_ZERO(&fdsocket);FD_ZERO(&readfds);FD_ZERO(&writefds);FD_ZERO(&exceptfds);FD_SET(SListen,&fdsocket);timeout.tv_sec = 1;timeout.tv_usec = 0;u_long ul=1; ioctlsocket(SListen,FIONBIO,&ul);/非阻塞while (m_running && (g_cMainCtr
51、l.m_bRunning) && g_cMainCtrl.m_cBot.m_bJoined)/1022/if (listmaxnum = 0 && listmaxnum > 20)if (m_ssocket != INVALID_SOCKET)xClose(m_ssocket);m_ssocket = INVALID_SOCKET;#ifdef DBGCONSOLEif(!listmaxnum) / If its server, use another textg_cMainCtrl.m_cConsDbg.Log(2, "Cbot(0x%8.8Xh): Giving up server "%s:%d" after %d retries!n", this, g_cMainCtrl.m_cBot.
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 班會課件-感恩
- 2024年小班元宵節(jié)活動策劃方案
- 建筑工人安全教育
- 高級育嬰員試題庫(含答案解析)
- 1月臨床醫(yī)學概論習題+答案(附解析)
- 《北斗導航基本原理》課件
- 幼兒急疹診療護理培訓
- 《基礎數據分析優(yōu)化模型》課件
- 玻尿酸課件教學課件
- 環(huán)評工程課件下載
- 中藥學電子版教材
- 畢業(yè)設計外文文獻-基于 Vue.js 的后臺單頁應用管理系統(tǒng)的研究與實現(xiàn)
- 新產品開發(fā)打樣流程
- 三軸龍門機械手
- 婦產科護理學智慧樹知到答案章節(jié)測試2023年石河子大學
- 文化差異與跨文化交際智慧樹知到答案章節(jié)測試2023年
- 石油石化行業(yè)數字化轉型規(guī)劃課件
- GB/T 4226-2009不銹鋼冷加工鋼棒
- 肌筋膜激痛點及還原
- 鋰離子電池粘結劑總結ATLCATL課件
- 九種基坑坍塌事故案例分析課件
評論
0/150
提交評論