P2Pbot的原理及客户端端模块的设计与实现_第1页
P2Pbot的原理及客户端端模块的设计与实现_第2页
P2Pbot的原理及客户端端模块的设计与实现_第3页
P2Pbot的原理及客户端端模块的设计与实现_第4页
P2Pbot的原理及客户端端模块的设计与实现_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、P2P bot的原理及客户端端模块的设计与实现 内容摘要:僵尸网络是一种从传统恶意代码形态进化而来的新型攻击方式,为攻击者提供了隐匿、灵活且高效的一对多命令与控制机制,可以控制大量僵尸主机实现信息窃取、分布式拒绝服务攻击和垃圾邮件发送等攻击目的.僵尸网络正步入快速发展期,对因特网安全已造成严重威胁,对中国大陆造成的危害尤为严重.本文介绍了僵尸网络的演化过程和基本定义。客户端是P2P Botnet的bot程序重要的组成部分,本文详细介绍了客户端主要功能模块及各模块之间的运行关系。阐述了客户端工作流程及相关的关键数据结构。开发中利用了计算机网络编程的基本理论知识。经过分析这些情况,该客户端采用Mi

2、crosoft Visual C+ 6.0为基本开发环境。关键字: 网络安全;僵尸网络;客户端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+语言及系统开发工具简介12.1 C+语言的由来22.2 C+语言的发展22.3 C+语言的特点22.4 系统开发工具33 系统描述43.1 选课来源43.2 P2P协议常识43.3 P2P bot的原理43.4 需求分析53.5 系统功能模块概述53.5.

5、1 客户端53.5.2 服务器端 . 54 P2P bot客户端总体设计64.1 系统运行环境64.1.1 硬件环境. 64.1.2 软件环境. 64.2 客户端与服务器端功能原理的实现84.3 系统实现原理 . 95 详细设计95.1 客户端程序编写105.1.1 客户端程序105.1.2 客户端执行程序. 125.1.3 服务器监听程序185.2 功能测试. 236结束语24参考文献25P2P bot的原理及客户端端模块的设计与实现客户端1 引言1.1 国内外研究背景资料僵尸网络是近年来兴起的危害互联网的重大安全威胁之一,攻击者通过各种途径传播僵尸程序感染互联网上的大量主机,而被感染的主机

6、将通过一个控制信道接收攻击者的指令,组成一个僵尸网络。大部分的僵尸网络都可以在攻击者的控制下进行进一步的传播,从而使得僵尸网络的规模越来越庞大。一旦攻击者拥有一定规模的僵尸网络,就可以利用僵尸网络所控制的资源,在互联网上建立起了一种强势地位,并且可以利用这些资源获取经济利益。僵尸网络的危害主要体现在发动分布式拒绝服务攻击、发送垃圾邮件以及窃取僵尸主机内的敏感信息等。研究显示全世界接入因特网的计算机中大约有40%被感染了僵尸程序(bot),并受攻击者控制。基于P2P协议的半分布式僵尸网络(Partially Decentralized P2P Botnet )已经成为网络安全研究人员关注的焦点。

7、由于P2P网络中每个节点是对等的,即使移除半分布式P2P 僵尸网络中的一个或者几个中心bot节点或一批非中心bot节点,对整个僵尸网络不会造成致命的影响;半分布式P2P僵尸网络的控制方式采用分布式的控制,各个bot之间的通信流量隐藏在了大量的正常P2P通信流量下。这些特点使得半分布式P2P僵尸网络具有更好的安全性,隐秘性和鲁棒性。这给半分布式P2P僵尸网络的发现、跟踪和控制带来了巨大的挑战。目前,国内外对半分布式P2P Botnet的研究仍然处于初级阶段,还未给出通用的检测方法。要检测和跟踪半分布式P2P Botnet,需了解它的控制机制和运行原理。本文概要介绍了Botnet技术,分析了基于P

8、2P 技术的Botnet 的特点并研究在基于P2P协议机制的bot程序中,客户端所扮演的角色。2 C+语言及系统开发工具简介2.1 C+语言的由来C+是从C语言发展演变而来的一种面向对象的程序设计语言。贝尔实验室的本贾尼·斯特劳斯特卢普(w:en:Bjarne Stroustrup)博士在20世纪80年代发明并实现了C+(最初这种语言被称作“C with Classes”)。C+是作为C语言的增强版出现的,从给C语言增加类开始,不断的增加新特性。2.2 C+语言的发展C+语言发展大概可以分为三个阶段:第一阶段从80年代到1995年。这一阶段C+语言基本上是传统类型上的面向对象语言,并

9、且凭借着接近C语言的效率,在工业界使用的开发语言中占据了相当大份额;第二阶段从1995年到2000年,这一阶段由于标准模板库(STL)和后来的Boost等程序库的出现,泛型程序设计在C+中占据了越来越多的比重性。当然,同时由于Java、C#等语言的出现和硬件价格的大规模下降,C+受到了一定的冲击;第三阶段从2000年至今,由于以Loki、MPL等程序库为代表的产生式编程和模板元编程的出现,C+出现了发展历史上又一个新的高峰,这些新技术的出现以及和原有技术的融合,使C+已经成为当今主流程序设计语言中最复杂的一员。2.3 C+语言的特点C+的主要特点表现在两个方面,一是全面兼容C,二十支持面向对象

10、的方法。面向对象的程序设计方法将数据及对数据的操作方法封装在一起座位一个相互依存、不可分离的整体对象。对同类型对象抽象出气共性,形成类。类中的大多数数据,只能用本类的方法进行处理。类通过一个简单的外部皆可,与外界发生关系,对象与对象之间通过消息进行通信。这样,程序模块间的关系简单,程序模块的独立性,数据的安全性具有良好的保障。同时,通过继承与多态性,使程序具有很高的可重用性,是的软件的开发和维护都更为方便。由于面向对象方法的突出优点,目前它已经成为开发大型软件才用的主要方法,而C+语言是应用最广泛的面向对象的程序设计语言之一。2.4 系统开发工具Microsoft Visual C+ 6.0

11、简介Visual C+是一个功能强大的可视化软件开发工具。自1993年Microsoft公司推出Visual C+1.0后,随着其新版本的不断问世,Visual C+已成为专业程序员进行软件开发的首选工具。虽然微软公司推出了Visual C+.NET(Visual C+7.0),但它的应用的很大的局限性,只适用于Windows 2000,Windows XP和Windows NT4.0。所以实际中,更多的是以Visual C+6.0为平台。Visual C+6.0不仅是一个C+编译器,而且是一个基于Windows操作系统的可视化集成开发环境(integrated development env

12、ironment,IDE)。Visual C+6.0由许多组件组成,包括编辑器、调试器以及程序向导AppWizard、类向导Class Wizard等开发工具。 这些组件通过一个名为Developer Studio的组件集成为和谐的开发环境。Visual C+它大概可以分成三个主要的部分:1 Developer Studio,这是一个集成开发环境,我们日常工作的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 系统描述3.1 选课来源根据当前网络的发展,网络安全越来越受各种网民所关注。基于P2P协议的僵尸网络(Partially Decentralized P2P Botnet )也已经成为网络安全研究人员关注的焦点。因此作为网络中的一员对起进行研究和探讨也是是有必要,通过研P2P bot的原理使我们可以更加了解网络安全的必要性。而且对我们在今后参与到网络中也有着很大的帮助。而本人也学习过C+语言,对网络编程和网络安全也较有兴趣,为

16、了更好的考验自己对C+语言以及网络知识方面的掌握程度,本人就决定以P2P bot的原理及客户端端模设计与实现为毕业设计,希望通过这一次的毕业设计发现自己在专业知识方面的欠缺,然后进一步提高本人的网络开发编程的能力。3.2 P2P协议常识P2P是peer-to-peer的缩写,peer在英语里有"(地位、能力等)同等者"、"同事"和"伙伴"等意义。这样一来,P2P也就可以理解为"伙伴对伙伴"的意思,或称为对等联网。利用P2P技术,计算机之间可以进行直接交互,而不需要使用任何一台中央服务器。而且由于大部分处理直接在节点

17、之间进行,减少了对服务器的依赖,具有很好的可扩展性。目前,P2P技术已经应用于很多领域,如:文件共享、即时通讯、协同工作、分布式计算、电子商务、网络游戏以及信息检索等方面,其中网络文件共享应用最为广泛。3.3 P2P bot的原理Servent bots (服务节点或超级节点):是僵尸网络控制者(botmaster)从僵尸网络中选择的,性能和安全性能比较好的受控主机来做为服务节点(一般选择静态IP的主机)。服务节点(servent bots)类似于一个服务器,但又包含了Client bots 的功能,可以对接收到的指令进行转发、处理,它可以主动连接其它的服务节点,同时也接受客户节点(Clien

18、t bots)和其它服务节点的连接。Client bots(客户节点):它也是受控的主机(一般为动态)。它能主动的周期性的连接Servent bots 。在这两种节点(即每台受控主机)中都存有一张有限的邻接的服务节点的链表(peer list),链表中有服务节点的IP地址,但并不包括客户节点的IP (因为客户节点一般都有动态的IP)。根据节点在整个僵尸网络中的地位和作用不同,将所有的节点分为了两类:servent bot节点 和client bot节点。半分布式P2P botnet所有的节点均部署统一的、基于P2P协议机制的bot程序。Bot 程序包含客户端程序、控制服务器程序和指令功能实施模

19、块三个部分。Client bot 仅启动客户端程序,servent bot既启动客户端程序又启动控制服务器程序。3.4 需求分析要测试运行P2P bot客户端,我们还需要服务器端。首先来看一下客户端的任务: 客户端能主动连接服务器端Servent bots ,并向服务器端发送消息。服务器应该完成的工作包括:1. 服务器与客户端建立连接。 2. 接收来自客户端的信息,接收到的信息如果为认证信息,判断其是否通过认证。相对服务器而言,客户端的任务较为简单,有了以上的简单分析,可以知道,解决上述几个问题,即完成了该P2P bot客户端的核心任务。3.5 系统功能模块概述3.5.1 客户端Client

20、bots(客户节点):它也是受控的主机(一般为动态)。它能主动的周期性的连接Servent bots 。3.5.2 服务器端Servent bots (服务节点或超级节点):是僵尸网络控制者(botmaster)从僵尸网络中选择的,性能和安全性能比较好的受控主机来做为服务节点(一般选择静态IP的主机)。服务节点(servent bots)类似于一个服务器,但又包含了Client bots 的功能,可以对接收到的指令进行转发、处理,它可以主动连接其它的服务节点,同时也接受客户节点(Client bots)和其它服务节点的连接。4 P2P bot客户端总体设计客户端与服务器端建立的连接图:4.1.

21、1硬件环境A. 具有奔腾4、64兆内存和显存配置以上的计算机。B. Microsoft鼠标或其它兼容鼠标。C. 最少500MB的硬盘空间,常规安装需要500MB硬盘空间,完全安装需要1G硬盘空间。 D. WindowsXP中文版更高。E. VGA显示器或更高。4.1.1软件环境使用4台主机作为测试对象。其中3台主机作为服务器节点,1台主机作为客户端节点。4台主机中分别植入了半分布式的P2P bot程序,在局域网内。4.1 客户端与服务器端功能原理的实现 服务器与客户端建立连接之后,处理接收信息的控制流程如图2所示。 图21、服务器与客户端建立连接,并创建相应的套接字对象。利用套接字对象集合存储

22、新的套接字对象。这样,一条连接对应了一个套接字对象(如图2)。2、接收来自客户端的信息。接收到的信息如果为认证信息,判断其是否通过认证:1通过认证,则将返回该服务器的认证信息到源bot。并判断该连接是否已经断开,如果没有,继续接收来自客户端的信息。2没有通过认证,将直接断开与客户端的连接。3、接收到非认证信息,判断是否为其它bot的id号(通过m_bid标志判断)。如果是,则交换该bot的id号,将该id号发送回源bot。如果为其它的指令,交由解析指令模块执行。4、对解析出来的指令,判断该指令是否为反馈信息。如果为反馈信息,则根据源地址将该反馈信息返回给源bot。如果为bot的执行指令,交由b

23、ot的处理指令模块进行处理。5、判断客户端和服务器的连接是否断开。断开则关闭套接字、清除套接字对象。l服务器线程处理一条连接完成。bot主程序仍在运行,服务器继续监听;主程序已经终止,则终止服务器程序。4. 2 系统实现原理botmasterServent botsClient bots节点2节点1节点3节点4节点5P2P bot 工作的原理图31、控制者(botmaster)用私钥登陆到已知的服务节点(Servent bots)中的任何一个节点,并向该台服务节点(Servent bots)发送指令(如图的所示)。2、服务节点收到指令后,与该台主机的bot 中所存储的接收到的指令(每条指令都有

24、一个ID)比较,如果这条指令已接收过,则不处理这条指令。如果这条指令从未接收过,那么服务节点根据peer list 中的服务节点的IP 将这条指令转发给peer list 中的所有服务节点(Servent bots)。同时该台主机也要处理该条指令。(如图中的所示)3、其它的服务节点(Servent bots)周期性的主动连接其peer list 中的服务节点(Servent bots)(如上图所示的节点2主动连接节点1、节点3主动连接节点4),一旦建立连接,节点2向节点1发送一个探测包,要求将最近收到的一条指令发送过来。节点1收到探测包后,向节点2 发送最近的一条指令(如图中的所示)。4、节点

25、(所有bots)接收到指令后,也要判断是否接收过此条指令。如果在指令链表中已有此条指令,将不做任何处理;如果没有,则将此条指令转发给该bot 的peer list 中的所有服务节点(Servent bots)(如图中所示),再重复步骤2。同时该主机分析处理这条指令。5 详细设计5.1 客户端程序编写5.1.1 客户端程序 建立客户端建立客户端程序并对发送的数据先加密,用公钥加密数据msg相关代码如下:void CClient:Cmd_Forward(CString &cmd, bool cmd_reply, CThread *object)/用本服务器(bot)的对称密钥

26、加密数据再发送Cmd_Forward(cmd.Str(), cmd_reply, object);void CClient:Cmd_Forward(char *cmd, bool cmd_reply, CThread *object)/用本服务器(bot)的对称密钥加密数据再发送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 客户端执行程序 与服务器建立连接客户端与服务器端进行连接,发送数据。 相关代码如下: #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); /休息一段时间,再继续连接服务器,可停顿较长的时间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);/对它加密然后再发出去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, "认识口令已经发送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, "客户端发送信息成功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) /如果为真要先加密然后再发送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 服务器监听程序当客户端与服务器端进行连接时,服务器进行监听。具体来说有以下几个步骤:创建监听套接字、绑定套接字、侦听、连接、发送接收数据、关闭。相关

47、代码如下:void *CListerServer:Run() /创建监听套接字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);/监听 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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论