《winpcap网络嗅探器课程设计(24页).doc》由会员分享,可在线阅读,更多相关《winpcap网络嗅探器课程设计(24页).doc(24页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、-winpcap网络嗅探器课程设计-第 21 页课程设计题 目:基于WinPcap的网络嗅探器设计与实现专业班级:网络工程完成时间:2015年1月目录目录2一 引言11.1 编写目的11.2 问题背景1二 需求分析32.1 需求规定32.1.1 用户需求32.1.2 功能需求32.1.3 性能需求42.2 开发平台4三 概要设计53.1 TCP/IP协议族和WinPcap简介53.1.1 TCP协议族53.1.2 WinPcap简介83.2 系统总体分析与设计9系统总体结构分析与设计93.2.2 系统总体流程9系统数据结构分析与设计10四 系统详细设计与实现14数据捕获模块的设计与实现14协议
2、解析模块的设计与实现15用户界面模块的设计与实现17控件写数据的基本操作184.3.2 根据不同协议显示不同颜色19对数据格式化显示20五 结语22六 附录236.1 参考文献23主要函数代码23一 引言1.1 编写目的本需求的编写是为了研究基于WinpCap网络嗅探(网络抓包)程序的开发途径和应用方法。同时它也是进行项目策划、概要设计和详细设计的基础,是维护人员进行内部维护,信息更新,验收和测试的依据,是用户操作说明的指导文档,是开发人员和用户交互的良好界面。1.2 问题背景随着网络技术的飞速发展,加速了全球信息化的进程,各种重要数据在网上的传播日益普遍,使得网络安全问题越来越为人们所关注。
3、网络嗅探(网络抓包)工具作为一种网络数据监听程序,在网络安全攻防方面扮演了很重要的角色,目前已经有不少网络嗅探(网络抓包)工具,譬如在Windows环境下,最富盛名的工具是Netxray、WireShark(原Ethereal)。网络嗅探(网络抓包)工具实际上是一把双刃剑,通过使用网络嗅探(网络抓包)工具,可以把网卡设置于混杂模式,并可实现对网络上传输的数据包的捕获与分析,此分析结果可供网络安全分析之用,也可为黑客发动进一步的攻击提供有价值的信息。而在网络安全方面,目前使用最广泛的TCP/IP协议存在许多安全缺陷,网络嗅探(网络抓包)工具可以有效地探测在网络上传输的数据包信息,通过对这些信息的
4、分析是有助于网络安全维护的。根据网络安全技术发展分析一文中的数据,2007年以来网络监听技术出现了新额重要特征,传统的Sniffer技术是被动地监听网络通信、用户名和口令,而新的Sniffer技术则主动地控制通信数据。我们通过对网络嗅探(网络抓包)工具的数据包的捕获与分析功能的进一步了解,才能做到知己知彼,有针对性地获取所需要的信息,利用这些信息进行网络安全分析的网络威胁应对。因此对网络嗅探(网络抓包)技术的研究具有重要的意义。计算机网络的设计为嗅探器的使用创造了最基本的条件。在目前的网络环境中,所有计算机节点都是共享传输介质,任意节点发出或发往任意节点的数据帧必将经过网内每一个节点的网络接口
5、,此时只需对嗅探节点的网络接口( 网卡) 进行适当的设置便可为实现嗅探的做好准备工作。在计算机网络系统中,网卡是用来接收网络上其他节点发来的数据帧,其内嵌的单片处理程序会检测数据帧来源的MAC 地址,并根据网卡所设置的接收方式来是否接收处理数据,如果认为应该处理,则网卡就会产生中断信号通知中央处理器,接收该数据帧并传输给操作系统处理。否则就简单丢弃,所对应节点的网卡就截断,计算机的中央处理器并不参与。网卡是网络中节点主机的关键硬件设备。对数据的接收一般有四种设置模式: 广播模式: 接收在网络中进行广播数据信息。组播模式: 接收组播数据信息。单播模式: 只有匹配的目的网卡才能接收数据信息。混杂模
6、式: 网卡能够可以接收一切通过它的数据信息。二 需求分析 需求规定2.1.1 用户需求网络嗅探(网络抓包)是一种利用计算机的网络接口截获其它计算机数据报文的工具。使用网络嗅探(网络抓包)工具的主要人群是黑客或网络安全技术人员,从攻击的角度,黑客可以使用网络嗅探(网络抓包)程序非法获取网络中传输的大量敏感信息,如账号和口令等,对网路安全极具威胁;从防守的角度,网络嗅探(网络抓包)技术是居于网络的入侵检测系统的最底层环节,是整个系统的数据来源,为技术人员提供重要的依据。无论是黑客还是安全人员,他们对抓包技术的利用途径都是一样的,即对网络上传输的数据包进行捕获与分析,获取不要的信息,但是他们的目的是
7、不一样的,前者是专门利用计算机网络搞破坏或恶作剧,而后者是通过对这些信息的分析利用。维护网络安全与稳定。因此用户提出了以下要求:(1)能够捕获网络数据包,并能对数据包进行简单的分析。(2)精确的设置捕捉规则和灵活的过滤策略,能使用户方便、准确地捕获所需要的信息。(3)界面友好,操作简单。2.1.2 功能需求尽管网络嗅探(网络抓包)工具作为网络安全方面最常见的工具被广泛使用,但是它的基本原理其实很简单,就是先把同卡设备设为混杂模式,然后直接接收链路层的数据。为了实现用户所提出的各种需求,抓包工具必需达到以下功能:(1)运行于数据链路层,监视网络状态,对数据帧进行捕捉和统计,为优化网络性能、增强系
8、统安全性提供充分有效的依据。此时的工作网卡处于混杂模式。(2)能够对网络中捕捉的数据包解码,用于故障分析。如数据包的编号、长度、硬件地址类型、协议地址类型、MAC地址长度、IP地址长度、操作代码、发送者硬件地址、目标硬件地址、源IP、目的IP等相关信息。(3)友好的图形化界面,不需要复杂的命令,大部分功能通过鼠标点击就可达到,操作简单、方便。(4)用户能够自定义过滤规则,使数据包的捕获更加精准和具有灵活性,增强了软件功能以及与用户的交互能力。2.1.3 性能需求一个程序除了能正常运行并且达到相应的功能外,对程序性能也有严格的要求,性能需求决定了整个系统的性能档次、所采用的技术和设备档次,本程序
9、除了达到常用软件对响应时间以及差错控制的要求外,还提出以下要求:(1)数据精确性:捕获到的数据包并不仅仅是单纯的数据信息,而是包含有IP头、TCP头等信息头的最原始的数据信息,这些信息保留了它在网络传输时的原貌,为分析网络信息提供了重要资料。(2)适应范围:优秀的抓包工具能够分析几百种协议。一般情况下,大多数的抓包工具至少能够分析下面的协议:IP、TCP、UDP、ICMP、ARP等。 开发平台开发平台:Windows 7开发语言:C+集成开发环境:Visual Studio 2010辅助开发工具:WinPcap开发包(WinPca)三 概要设计3.1 TCP/IP协议族和WinPcap简介本系
10、统使用的开发包WinPcap是Windows平台下的专业网络数据包捕获开发包。3.1.1 TCP协议族TCP协议和IP协议指两个用在Internet上的网络协议(或数据传输的方法)。它们分别是传输控制协议和互联网协议。这两个协议属于众多的TCP/IP协议族的一部分。在TCP/IP协议族中,有很多种协议。图2-1给出了TCP/IP协议族中不同层次的协议。图2-1 TCP/IP协议族中不同层次的协议(1) TCP数据报格式传输控制协议TCP(transmission control protocol)是专门用于在不可靠的因特网上提供可靠的、端到端的字节流通信协议。TCP虽然是面向字节流的,但TCP
11、传送的数据单元却是报文段。一个TCP报文段分为首部和数据两部分,而TCP的全部功能都体现在它首部中各字段的作用。图2-2给出了TCP报文段的首部格式。图2-2 TCP报文段的首部格式(2)UDP数据报格式用户数据报UDP有两个字段:数据字段和首部字段。首部字段很简单,只有8个字节(图2-3),由四个字段组成,每个字段的长度都是两个字节。图2-3 UDP用户数据报的首部和伪首部(3)IP数据报格式IP是TCP/IP协议族中最为核心的协议。所有的TCP、UDP、ICMP及IGMP数据都以IP数据报格式传输。图2-4是IP数据报的完整格式。图2-4 IP数据报格式(4)ICMP数据报格式ICMP报文
12、是在IP数据报内部被传输的。ICMP报文的格式如图2-5所示。所有的报文的前4个字节都是一样的,但是剩下的其他字节则互不相同。类型字段可以有15个不同的值,以描述特定类型的ICMP报文。某些ICMP报文还使用代码字段的值来进一步描述不同的条件。检验和字段覆盖整个ICMP报文。图2-5 ICMP报文格式(5)ARP数据报格式在以太网上解析IP地址时,ARP请求和应答分组的格式如图2-6所示(ARP可以用于其他类型的网络,可以解析IP地址以外的地址。紧跟着帧类型字段的前四个字段指定了最后四个字段的类型和长度)。图2-6 用于以太网的ARP请求或应答分组格式3.1.2 WinPcap简介WinPca
13、p(Windows Packet Capture)是Windows平台下一个免费,公共的网络访问系统。是Libpcap在Windows平台下的版本,针对Windows进行了优化处理和扩展。WinPcap驱动有如下功能:1、捕获原始数据包,包括在共享网络上各主机发送/接收的以及相互之间交换的数据WinPcap结构包。2、在数据包发往应用程序之前,按照自定义的规则将某些特殊的数据包过滤掉。3、在网络上发送原始的数据包。4、收集网络通信工程中的统计信息。WinPcap的主要功能在于独立于主机协议(如TCP/IP)而发送和接收原始数据包。也就是说,WinPcap不能阻塞、过滤或控制其他应用程序数据包的
14、发收,它仅仅只是监听共享网络上传送的数据包。WinPcap提供给用户两个不同级别的编程接口:一个基于Libpcap的,另一个是较底层的。WinPcap的配置过程如下(以为例):1、添加头文件目录:工具选项目录Include files添加WpdPackInclude目录。2、添加库文件目录:工具选项目录Library files添加WpdPackLib目录。3、添加预处理定义WPCAP和HAVE_REMOTE:工程设置C/C+预处理程序定义添加WPCAP和HAVE_REMOTE。4、添加库函数:工程设置连接对象/库模块添加。5、添加头文件在每个使用了WinPcap函数的源文件中添加。3.2 系
15、统总体分析与设计在以太网中,信息是以明文的形式在网络上传输的,当将网络适配器设置为混杂模式时,由于采用以太网广播信道争用的方式,使得监听系统与正常通信的网络能够并联连接,并可以捕获任何一个在同一冲突域上传输的数据包。运用这一原理使信息捕获系统能够拦截我们所要的信息,这是捕获数据包的物理基础。首先抓包系统必须绕过操作系统的协议栈来访问在网络上传输的原始数据包。WinPcap提供了两个不同的库:和。提供了更加友好、功能更加强大的函数调用。 3系统总体结构分析与设计本系统基于WinPcap捕获和分析网络数据包的思想和方法进行设计,整体结构按功能分为3个部分,分别是数据捕获模块、协议解析模块和用户显示
16、模块。系统的总体结构如图2-7所示。网络嗅探器用户界面协议解析模块数据捕获模块图2-7 系统的总体结构3.2.2 系统总体流程用户可以根据需要选择指定的检测网卡,对要侦听的报文类型、IP地址和传输方向进行设置(即过滤设置)。捕获后系统简要显示每个报文的标识,源、目的地址,长度和类型信息。当选中一报文时,系统显示该报文的结构解析树和完整十六进制信息。系统总体流程如图2-8所示。开始得到网卡句柄选择监听的网卡设置过滤器选择数据包定位、初始化打开网卡接受并显示数据分析数据包释放设备、缓冲区结束图2-8 系统总体流程3系统数据结构分析与设计系统每捕获到一个数据包,就要对数据包进行协议解析。解析过程需要
17、构造相应类型的报文对象。系统基于对TCP/IP协议族数据报格式的分析,对各个报文类都有详细的描述。(1)pcap抓到都是数据链路层的数据包(即以太帧),要对数据包进行协议分析,首先要构造以太帧头部对象。以太帧头部的类描述如下:/Mac帧头 占14个字节struct ethhdru_char dest6;/6个字节 目标地址u_char src6;/6个字节 源地址u_short type;/2个字节 类型(2)以太帧的数据部分可能是ARP数据报或者是IP数据报等等。系统在对其进行进一步的协议解析的过程中,就要根据以太帧头部的类型字段进行构造相应类型的数据报对象。IP数据报的描述如下:/定义IP
18、头 struct iphdr#if defined(LITTLE_ENDIAN)u_char ihl:4; u_char version:4;#elif defined(BIG_ENDIAN)u_char version:4;u_char ihl:4;#endifu_char tos;/TOS 服务类型u_short tlen;/包总长 u_short占两个字节u_short id;/标识u_short frag_off;/片位移u_char ttl;/生存时间u_char proto;/协议u_short check;/校验和u_int saddr;/源地址u_int daddr;/目的地址
19、u_intop_pad;/选项等ARP数据报的描述如下:/ARP头struct arphdru_short ar_hrd;/硬件类型u_short ar_pro;/协议类型u_char ar_hln;/硬件地址长度u_char ar_pln;/协议地址长度u_short ar_op;/操作码,1为请求 2为回复u_char ar_srcmac6;/发送方MACu_char ar_srcip4;/发送方IPu_char ar_destmac6;/接收方MACu_char ar_destip4;/接收方IP(3)对IP数据报的数据部分分析可能的情况:TCP数据报、UDP数据报和ICMP数据报等。系
20、统在进行协议解析时要根据IP数据报的协议字段进行构造对应类型的数据报对象。TCP数据报的描述如下:/定义TCP头struct tcphdru_short sport;/源端口地址 16位u_short dport;/目的端口地址 16位u_int seq;/序列号 32位u_int ack_seq;/确认序列号 #if defined(LITTLE_ENDIAN)u_short res1:4,doff:4,fin:1,syn:1,rst:1,psh:1,ack:1,urg:1,ece:1,cwr:1;#elif defined(BIG_ENDIAN)u_short doff:4,res1:4,
21、cwr:1,ece:1,urg:1,ack:1,psh:1,rst:1,syn:1,fin:1;#endifu_short window;/窗口大小 16位u_short check;/校验和 16位u_short urg_ptr;/紧急指针 16位u_int opt;/选项UDP数据报的描述如下:/定义UDP头struct udphdru_short sport;/源端口 16位u_short dport;/目的端口 16位u_short len;/数据报长度 16位u_short check;/校验和 16位ICMP数据报的描述如下:/定义ICMPstruct icmphdru_char
22、type;/8位 类型u_char code;/8位 代码u_char seq;/序列号 8位u_char chksum;/8位校验和四 系统详细设计与实现4.1数据捕获模块的设计与实现数据捕获模块的主要功能是进行数据采集,这是整个系统的基础和数据来源。系统使用WinPcap来捕获网络中的原始数据包。系统首先调用pcap_findalldevs()函数,初始化网卡选择界面,用户选择要检测的网卡、设置好过滤条件并单击”开始”菜单项(或工具栏项)后,系统调用pcap_open_live()函数将网卡设置为混杂模式。接下来,系统调用pcap_loop()函数,循环捕获网络数据包。每捕获一个数据包就调
23、用设计好的回调函数来检测数据包是否符合过滤条件,符合就给显示界面发送信息,通知其显示数据包信息。一旦用户单击”停止”菜单项(或工具栏项),系统就调用pcap_close()函数,关闭Winpcap操作,并销毁相应资源。数据捕获主要代码如下:/开始捕获int CMy44174413snifferDlg:My44174413sniffer_startCap()int if_index,filter_index,count;u_int netmask;struct bpf_program fcode;My44174413sniffer_initCap();/获得接口和过滤器索引if_index =
24、this-m_comboBox.GetCurSel();filter_index = this-m_comboBoxRule.GetCurSel();if(0=if_index | CB_ERR = if_index)MessageBox(_T(请选择一个合适的网卡接口);return -1;if(CB_ERR = filter_index)MessageBox(_T(过滤器选择错误);return -1;/*获得选中的网卡接口*/dev=alldev;for(count=0;countnext;if (adhandle= pcap_open_live(dev-name,/ 设备名 65536
25、,/捕获数据包长度 1,/ 混杂模式 (非0意味着是混杂模式) 1000,/ 读超时设置 errbuf/ 错误信息 ) = NULL)MessageBox(_T(无法打开接口:+CString(dev-description);pcap_freealldevs(alldev);return -1;4.2协议解析模块的设计与实现由于pcap每次抓到一个数据包,都会提交其信息,方式为以unsigned char* 指向的一段缓冲区。现将缓冲区前14个字节读入,按以太帧格式构造以太帧头部的对象。然后根据以太帧头部中的Type字段,决定接下来应该构造IP、ARP或者RARP。假设是IP,那么把缓冲区中
26、第15个字节开始直到这块缓冲区最后的所以字节读入,按IP报文格式构造IP的对象,根据IP的Protocol字段,决定接下来构造TCP,UDP还是ICMP。假设是TCP,则将IP的数据内容读入,按TCP格式构造TCP的对象。系统首先显示捕获的数据包的简要信息,若用户对该数据包感兴趣,只要单击选中该数据包,系统就会显示该数据包的详细信息。若数据包中是IP数据报,则简要显示该数据包的主要代码如下:if(0x0800 = local_data-ethh-type)/IPHTREEITEM ip = this-m_treeCtrl.InsertItem(_T(IP协议头),data);str.Forma
27、t(_T(版本:%d),local_data-iph-version);this-m_treeCtrl.InsertItem(str,ip);str.Format(_T(IP头长:%d),local_data-iph-ihl);this-m_treeCtrl.InsertItem(str,ip);str.Format(_T(服务类型:%d),local_data-iph-tos);this-m_treeCtrl.InsertItem(str,ip);str.Format(_T(总长度:%d),local_data-iph-tlen);this-m_treeCtrl.InsertItem(str
28、,ip);str.Format(_T(标识:0x%02x),local_data-iph-id);this-m_treeCtrl.InsertItem(str,ip);str.Format(_T(段偏移:%d),local_data-iph-frag_off);this-m_treeCtrl.InsertItem(str,ip);str.Format(_T(生存期:%d),local_data-iph-ttl);this-m_treeCtrl.InsertItem(str,ip);str.Format(_T(协议:%d),local_data-iph-proto);this-m_treeCtr
29、l.InsertItem(str,ip);str.Format(_T(头部校验和:0x%02x),local_data-iph-check);this-m_treeCtrl.InsertItem(str,ip);str.Format(_T(源IP:);struct in_addr in;in.S_un.S_addr = local_data-iph-saddr;str.AppendFormat(CString(inet_ntoa(in);this-m_treeCtrl.InsertItem(str,ip);str.Format(_T(目的IP:);in.S_un.S_addr = local_
30、data-iph-daddr;str.AppendFormat(CString(inet_ntoa(in);this-m_treeCtrl.InsertItem(str,ip);解析数据包主要通过analyze_frame()这个函数实现的,实际上并非这个函数完成了所有的功能,其实从名字就可以看出,它只是完成了对“帧”的解析,也就是链路层数据的解析,还有analyze_arp()、analyze_ip()、analyze_ip6()、analyze_icmp()等来完成其他协议层的解析工作。需要特别说明的一点是,网络中的字节顺序跟主机中的字节顺序是完全不一样的,所以特别是要获得数字的值的时候,
31、一定要先调用ntohs()函数(network to host short)或ntohl()函数(network to host long)将数据包的网络字节顺转换为主机字节序,这样在做一些判断的时候才是准确的。由协议栈工作流程可知,数据是由应用层把数据加上应用层协议头后给传输层,传输层在最外面加上它的头部后给网络层,网络层在外面加上它的头部后再给链路层所以当数据包被捕获到之后最外面的就是链路层的协议头,因此首先要解析的就是链路层协议,这也就是为什么首先要调用analyze_frame()这个函数了,然后再一层一层把它“剥开”,最终获得里面的数据。每一层的上层可能有多种协议在工作,比如IP上层
32、就有TCP和UDP等之分,所以在解析数据包的时候需要根据不同的特征来判断上层协议到底是什么,然后再来调用相关的函数对其进行解析,下面将列出一些主要的判断特征:(1) 链路层-网络层网络层可能会有arp、ipv4、ipv6这三种不同的情况,在链路层定义了一个type字段,专门用于指示网络层数据包是什么类型。type = 0x0806 表示这是一个arp包type = 0x0800 表示这是一个ipv4包type = 0x86dd 表示这是一个ipv6包(2) 网络层(IP层)-传输层IP层之上可能会有tcp、udp、icmp等IPv4协议定义了proto字段来指示传输层协议是什么。还记得上一章的
33、文件中的这段定义不?proto什么值对应什么协议很明白了吧?#definePROTO_ICMP 1#define PROTO_TCP 6 #define PROTO_UDP 17 IPv6使用nh字段来标明传输层协议,如下:nh= 0x3a 表示上层是icmpv6nh= 0x06 表示上层是tcpnh= 0x11 表示上层是udp(3) 传输层之上就是应用层了,这里我们的应用层只支持http协议,判断方法很简单,就是看目的或源端口是不是80。余下的工作就是一个字段一个字段地获取数据包的值了。4.3用户界面模块的设计与实现用户设计界面如图4-1所示:图4-1 设计界面要写在GUI上的数据主要有五
34、个部分:(1) 参数设置:网卡接口、过滤项(2) 数据包捕获列表,显示数据包简要信息(3) 树形目录,显示被选中的数据包头详细信息(4) 文本框,显示被选中的数据包十六进制信息(5) 统计信息:各类包的数量控件写数据的基本操作由于我们选择的是对话框的形式的界面,所以主界面只有一个,放置在主界面上的各个控件都可以通过主界面的this指针调用,并设置控件的值,例如: this-m_listCtrl.SetItemText(nItem,2,buf);其中m_listCtrl是放置于主界面上的一个列表控件,各种控件上的数据也就基本通过这样的方式调用。程序中我们新开了一个线程来处理数据,线程中每收到一个
35、数据包都需要更新一下界面,这样就可以实时看到捕获的数据及统计信息了,这需要我们把主界面的this指针传递给线程,如下: m_ThreadHandle=CreateThread(NULL,0,sinffer_CapThread,this,0,threadCap);线程处理函数原型如下: DWORD WINAPI sinffer_CapThread(LPVOID lpParameter);这里的lpParameter就是刚刚传递进来的this指针了,在函数中使用如下: Cmcf6Dlg*pthis = (Cmcf6Dlg*) lpParameter;4.3.2 根据不同协议显示不同颜色从图4-2可
36、以看到,List控件有一个事件是NM_CUSTOMDRAW,每次有新的一行加入的时候,都触发该事件,然后调用相关的处理函数进行自定义绘制,可以注册一个该事件。图4-2首先通过下面这段代码获得新加入到List列表中的数据位置POSITION pos = this-m_localDataList.FindIndex(pNMCD-nmcd.dwItemSpec);然后通过下面代码获得新加入行中存储的数据structdatapkt * local_data = (struct datapkt *)this-m_localDataList.GetAt(pos);最后根据数据中对应的协议设置不同的显示颜色
37、。这样,一个界面友好的列表就设置好了。对数据格式化显示主要通过下面这个函数实现,下面这个函数主要做了两件事:(1)将数据是16进制的形式显示;(2)将数据以字符形式显示。void print_packet_hex(const u_char* pkt,int size_pkt,CString *buf)int i=0,j = 0,rowcount; u_char ch; char tempbuf256; memset(tempbuf,0,256);for(i = 0;iAppendFormat(_T(%04x: ),(u_int)i);rowcount = (size_pkt-i) 16 ? 1
38、6 : (size_pkt-i);for (j = 0; j AppendFormat(_T(%02x ),(u_int)pkti+j);/不足16,用空格补足if(rowcount 16)for(j=rowcount;jAppendFormat(_T( );for (j = 0; j AppendFormat(_T(%c),ch);buf-Append(_T(rn);if(rowcountnext)devCount+;return 0;DWORD WINAPI sniffer_CapThread(LPVOID lpParameter)int res,nItem ;struct tm *lti
39、me;CString timestr,buf,srcMac,destMac;time_t local_tv_sec;struct pcap_pkthdr *header; /数据包头const u_char *pkt_data=NULL,*pData=NULL; /网络中收到的字节流数据u_char *ppkt_data;CMy44174413snifferDlg *pthis = (CMy44174413snifferDlg*) lpParameter;if(NULL = pthis-m_ThreadHandle)MessageBox(NULL,_T(线程句柄错误),_T(提示),MB_OK);return -1;while(res = pcap_next_ex( pthis-adhandle, &header, &pkt_data) = 0)if(res = 0)/超时continue;struct datapkt *data = (struct datapkt*)malloc(sizeof(struct datapkt);memset(data,0,sizeof(struct datapkt);if(NULL = data)MessageBox
限制150内