网络协议实验报告
协议设计开发实验报告(3篇)

第1篇一、实验背景随着信息技术的飞速发展,网络通信已成为现代社会的重要基础设施。
在计算机网络领域,协议的设计与开发至关重要。
本实验旨在通过设计和开发一个简单的网络协议,加深对协议原理的理解,提高网络编程能力。
二、实验目的1. 理解网络协议的基本原理和设计方法;2. 掌握网络编程技术,提高编程能力;3. 熟悉常用网络编程库和工具的使用;4. 培养团队合作精神和创新意识。
三、实验内容1. 设计网络协议;2. 编写协议实现代码;3. 测试协议功能;4. 分析实验结果。
四、实验步骤1. 设计网络协议(1)确定协议类型:选择应用层协议,如HTTP、FTP等;(2)定义协议格式:包括头部、数据体等部分;(3)设计数据传输方式:如TCP、UDP等;(4)考虑协议的安全性:如数据加密、认证等。
2. 编写协议实现代码(1)搭建开发环境:选择合适的编程语言和开发工具;(2)实现协议解析:解析接收到的数据包,提取头部、数据体等信息;(3)实现协议发送:封装数据包,发送至目标地址;(4)测试协议功能:编写测试代码,验证协议功能是否正常。
3. 测试协议功能(1)搭建测试环境:使用测试工具(如Wireshark、Burp Suite等);(2)发送测试数据:模拟实际应用场景,发送测试数据;(3)分析测试结果:观察数据包传输过程,验证协议功能是否满足设计要求。
4. 分析实验结果(1)总结协议设计中的优点和不足;(2)提出改进方案,优化协议性能;(3)总结实验过程中的经验和教训。
五、实验结果与分析1. 实验结果(1)成功实现协议设计,满足设计要求;(2)协议功能测试通过,数据传输稳定;(3)测试过程中未发现严重错误。
2. 分析(1)协议设计合理,能够满足实际应用需求;(2)代码结构清晰,易于维护和扩展;(3)测试过程中,发现部分细节问题,已进行优化。
六、实验总结1. 通过本次实验,掌握了网络协议的设计和开发方法;2. 提高了编程能力,熟悉了常用网络编程库和工具;3. 培养了团队合作精神和创新意识。
主要协议分析实验报告(3篇)

第1篇一、实验背景随着计算机网络技术的飞速发展,网络协议作为计算机网络通信的基础,扮演着至关重要的角色。
为了更好地理解网络协议的工作原理和功能,我们开展了主要协议分析实验。
本实验旨在通过分析常用网络协议的报文格式和工作机制,加深对网络协议的理解。
二、实验目的1. 熟悉常用网络协议的报文格式和工作机制。
2. 掌握网络协议分析工具的使用方法。
3. 培养网络故障排查和问题解决能力。
三、实验环境1. 实验设备:PC机、网线、Wireshark软件。
2. 实验网络:局域网环境,包括路由器、交换机、PC等设备。
四、实验内容本实验主要分析以下协议:1. IP协议2. TCP协议3. UDP协议4. HTTP协议5. FTP协议五、实验步骤1. IP协议分析(1)启动Wireshark软件,选择合适的抓包接口。
(2)观察并分析IP数据报的报文格式,包括版本、头部长度、服务类型、总长度、标识、标志、片偏移、生存时间、协议、头部校验和、源IP地址、目的IP地址等字段。
(3)分析IP分片和重组过程,观察TTL值的变化。
2. TCP协议分析(1)观察TCP数据报的报文格式,包括源端口号、目的端口号、序号、确认号、数据偏移、标志、窗口、校验和、紧急指针等字段。
(2)分析TCP连接建立、数据传输、连接终止的过程。
(3)观察TCP的重传机制和流量控制机制。
3. UDP协议分析(1)观察UDP数据报的报文格式,包括源端口号、目的端口号、长度、校验和等字段。
(2)分析UDP的无连接特性,观察UDP报文的传输过程。
4. HTTP协议分析(1)观察HTTP请求报文和响应报文的格式,包括请求行、头部字段、实体等。
(2)分析HTTP协议的请求方法、状态码、缓存控制等特性。
(3)观察HTTPS协议的加密传输过程。
5. FTP协议分析(1)观察FTP数据报的报文格式,包括命令、响应等。
(2)分析FTP的文件传输过程,包括数据传输模式和端口映射。
网络协议安全性实验报告

网络协议安全性实验报告在当今数字化社会中,网络协议扮演着至关重要的角色,它们负责在不同计算机之间传输数据的通信规则和约定。
然而,随着网络攻击技术的不断发展,网络协议的安全性问题日益凸显。
为了解决这一问题,本次实验旨在深入探讨网络协议的安全性,并通过实验验证其安全性程度。
一、实验背景网络协议是指计算机之间进行通信所必须遵守的规则和约定。
常见的网络协议有TCP/IP协议、HTTP协议、FTP协议等。
然而,网络协议的不安全性给网络通信带来了巨大的风险,如数据泄露、中间人攻击等。
因此,研究网络协议的安全性是至关重要的。
二、实验目的本次实验旨在探究网络协议的安全性问题,具体包括以下几个方面:1. 分析常见的网络协议存在的安全隐患;2. 通过实验验证网络协议的安全性程度;3. 提出改进网络协议安全性的建议。
三、实验内容本次实验选择了TCP/IP协议作为研究对象,通过模拟实验来验证其安全性。
实验步骤如下:1. 利用Wireshark等网络分析工具监控TCP/IP协议的数据传输过程;2. 对数据包进行分析,查找其中存在的安全隐患;3. 通过数据篡改、重放攻击等手段测试TCP/IP协议的安全性;4. 提出改进方案,并验证其有效性。
四、实验结果经过实验验证,我们发现TCP/IP协议在数据传输过程中存在一些潜在的安全隐患,如数据篡改、重放攻击等。
这些安全隐患可能会导致数据泄露、信息劫持等问题。
为了提高TCP/IP协议的安全性,我们建议在网络通信中加密数据、采用身份认证等手段。
五、实验总结通过本次实验,我们深入研究了网络协议的安全性问题,并通过实验验证了TCP/IP协议存在的安全隐患。
网络安全是当前亟需解决的重要问题,只有不断加强对网络协议的安全性研究,才能有效防范网络攻击和数据泄露。
希望未来能有更多的研究者投入到网络安全领域,共同促进网络安全技术的发展。
以上是本次网络协议安全性实验的报告内容,谢谢您的阅读。
网络层协议实验报告(3篇)

第1篇一、实验目的1. 理解网络层协议的基本概念和作用;2. 掌握IP协议、ARP协议和RIP协议的基本原理和配置方法;3. 通过实验验证网络层协议在实际网络中的应用。
二、实验环境1. 实验设备:一台安装有Cisco Packet Tracer软件的PC机;2. 实验软件:Cisco Packet Tracer 7.3.1模拟器;3. 实验拓扑:实验拓扑结构如图1所示,包括三台路由器(R1、R2、R3)和三台主机(H1、H2、H3)。
图1 实验拓扑结构图三、实验内容1. IP协议分析实验(1)实验目的:了解IP协议的基本原理和配置方法。
(2)实验步骤:① 在R1、R2、R3上配置IP地址、子网掩码和默认网关;② 在H1、H2、H3上配置IP地址、子网掩码和默认网关;③ 使用Ping命令测试H1与H2、H3之间的连通性;④ 分析实验结果,验证IP协议在网络层的作用。
(3)实验结果与分析:通过实验,验证了IP协议在网络层中实现数据包的传输和路由功能。
当H1与H2、H3之间进行通信时,数据包会按照IP地址进行路由,最终到达目标主机。
2. ARP协议分析实验(1)实验目的:了解ARP协议的基本原理和配置方法。
(2)实验步骤:① 在R1、R2、R3上配置IP地址、子网掩码和默认网关;② 在H1、H2、H3上配置IP地址、子网掩码和默认网关;③ 在H1上配置MAC地址与IP地址的静态映射;④ 使用Ping命令测试H1与H2、H3之间的连通性;⑤ 分析实验结果,验证ARP协议在网络层的作用。
(3)实验结果与分析:通过实验,验证了ARP协议在网络层中实现IP地址与MAC地址的映射功能。
当H1与H2、H3之间进行通信时,数据包会通过ARP协议获取目标主机的MAC地址,从而实现数据包的传输。
3. RIP协议分析实验(1)实验目的:了解RIP协议的基本原理和配置方法。
(2)实验步骤:① 在R1、R2、R3上配置IP地址、子网掩码和默认网关;② 在R1、R2、R3上配置RIP协议,使其相互通告路由信息;③ 在H1、H2、H3上配置IP地址、子网掩码和默认网关;④ 使用Ping命令测试H1与H2、H3之间的连通性;⑤ 分析实验结果,验证RIP协议在网络层的作用。
网络协议原理实验报告

网络协议原理实验报告1. 实验目的本实验旨在通过实际操作,理解和掌握网络协议的基本原理,包括数据传输过程中的分段、封装和解封装等关键步骤,以及网络协议的工作方式和作用。
2. 实验环境- 操作系统:Windows 10- 软件工具:Wireshark、Tera Term3. 实验内容3.1 数据传输过程的分段和封装首先,我们需要进行数据传输过程的分段和封装操作。
为了简化实验,我们选取一个简单的应用场景:从计算机A向计算机B发送一段文字信息。
步骤如下:1. 打开Tera Term,分别在计算机A和计算机B上运行。
2. 在计算机A上输入文字信息,例如:“Hello World!”。
3. 在计算机A上使用Wireshark进行抓包操作,监听计算机A与计算机B之间的数据传输过程。
4. 在计算机A上点击发送按钮,将文字信息发送给计算机B。
3.2 网络协议的工作方式和作用在数据传输过程中,网络协议起到了关键的作用。
具体来说,网络协议分为多个层次,每个层次都有自己的功能和任务。
其中,最为常见的是TCP/IP协议。
步骤如下:1. 在Wireshark抓包工具中,我们可以看到整个数据传输过程中的分段、封装以及网络协议的工作方式。
2. 在Wireshark中,我们可以看到每个数据包的详细信息,包括源IP地址、目的IP地址、数据长度等。
3. 在Wireshark中,我们还可以追踪每个数据包的传输路径,以及每个路由器的IP地址和工作状态。
4. 实验结果与分析根据实验步骤,我们可以得出如下实验结果与分析:- 在计算机A上输入文字信息并发送后,Wireshark抓包工具会显示对应的发送数据包。
- 在Wireshark中,我们可以看到每个数据包的详细信息,包括源IP地址、目的IP地址、数据长度等。
- 在Wireshark中,我们还可以追踪每个数据包的传输路径,以及每个路由器的IP地址和工作状态。
通过实验结果与分析,我们可以得出以下结论:- 在数据传输过程中,数据被分成多个较小的分段,分别进行封装。
网络解析协议实验报告(3篇)

第1篇一、实验目的1. 理解网络解析协议的基本概念和工作原理。
2. 掌握DNS、ARP等网络解析协议的报文格式和报文分析。
3. 学会使用抓包工具分析网络解析协议的报文传输过程。
4. 提高网络故障排查能力。
二、实验环境1. 硬件设备:PC机、网线、路由器。
2. 软件环境:Wireshark抓包软件、网络解析协议实验平台。
三、实验内容1. DNS协议分析(1)实验目的:了解DNS协议的工作原理,掌握DNS报文格式。
(2)实验步骤:① 在实验平台上配置好DNS服务器和客户端。
② 使用nslookup命令进行域名解析,并观察DNS服务器返回的结果。
③ 使用Wireshark抓包工具,捕获DNS查询和响应报文。
④ 分析DNS查询和响应报文的格式,包括报文类型、报文长度、域名、IP地址等信息。
2. ARP协议分析(1)实验目的:了解ARP协议的工作原理,掌握ARP报文格式。
(2)实验步骤:① 在实验平台上配置好主机A和主机B。
② 在主机A上使用ping命令ping主机B的IP地址,观察ARP请求和响应报文。
③ 使用Wireshark抓包工具,捕获ARP请求和响应报文。
④分析ARP请求和响应报文的格式,包括硬件类型、协议类型、硬件地址、协议地址等信息。
3. IP协议分析(1)实验目的:了解IP协议的工作原理,掌握IP数据报格式。
(2)实验步骤:① 在实验平台上配置好主机A和主机B。
② 在主机A上使用ping命令ping主机B的IP地址,观察IP数据报传输过程。
③ 使用Wireshark抓包工具,捕获IP数据报。
④ 分析IP数据报的格式,包括版本、头部长度、服务类型、总长度、生存时间、头部校验和、源IP地址、目的IP地址等信息。
四、实验结果与分析1. DNS协议分析结果:通过实验,我们了解到DNS协议在域名解析过程中的作用,以及DNS查询和响应报文的格式。
DNS协议通过查询和响应报文,实现域名到IP地址的转换,从而实现网络设备之间的通信。
协议分析实验报告

协议分析实验报告篇一:实验七、UDP 协议分析实验报告实验七、UDP 协议分析实验报告序号:姓名:学号:成绩1.实验目的:分析UDP协议报文格式.2.实验环境:局域网环境,或者是联网的单机。
3.实验步骤:(1)启动ethereal软件,开始报文捕获。
(2)捕获UDP的数据包(3)停止捕获报文。
4.实验分析,回答下列问题(1)请说明你是如何获得UDP的捕获文件,并附上捕获的截图。
答:①启动Etherel协议分析软件,并开始抓包。
②启动某个基于udp的应用程序,例如连接某个FTP站点,或通过浏览器访问某个网页。
③等出现浏览的网页后停止数据包的捕获。
④出现协议分析界面,将filter 一栏填入udp,则只显示udP协议信息信息。
(2)通过捕获的数据包分析UDP的报文结构,将UDP协议树中各名字字段,字段长度,(3)通过和实验六的结果比较,UDP报文和TCP报文结构有何区别?答:UDP报文由源端口号、目的端口号、长度、检验和、应用数据报文五个部分组成。
而TCP报文结构除此之外还有1)32比特的序号字段(2)32比特的确认号字段(3)16比特的接收窗口字段,用于流量控制(4)4比特的首部长度字段(5)可选与变长字段,用于发送方与接收方协商最大报文段长度(6)比特的标志字段,用于对已被成功接收报文段的确认。
(4)通过实验六和实验七,分析TCP协议和UDP协议的不同之处。
答:TCP协议是可靠的传输协议,具有流控制和拥塞控制,能够防止数据的丢失,还有确认重发机制保证数据的到达,应用于不允许数据丢失但对带宽无严格要求的服务。
UDP协议是不可靠的传输协议,无流控制和拥塞控制,是尽力服务机制,可最大程度的利用带宽,传输速率较快,应用于对带宽有严格要求但可以容忍数据丢失的服务。
篇二:实验三 IP协议分析实验实验报告班级: 0906401姓名:吴朋发学号:3 6 实验日期:评分:_____________1. 实验名称IP协议分析实验 2. 实验学时2学时 3. 实验类型设计型 4. 实验目的1、分析IP基本IP报头结构,给出每一个字段的值及其含义,加深对IP V4协议理解。
网络协议实验报告

网络协议实验报告摘要:本实验报告旨在研究和分析网络协议的重要性以及如何使用它们来实现安全和高效的数据传输。
通过实验,我们深入了解了几种常见的网络协议,并通过实际操作了解了它们的工作原理和应用场景。
实验结果表明,在合适的环境下,网络协议能够确保数据的可靠传输,并提供一定程度的安全性保障。
1. 引言网络协议是计算机网络中实现数据传输的基础。
它们定义了数据如何在计算机网络中传递和交换,确保数据的可靠性、安全性和高效性。
在本次实验中,我们将重点研究以下几种网络协议:1.1. TCP/IP协议TCP/IP协议是互联网中最常用的网络协议之一。
它分为四层:网络接口层、网络层、传输层和应用层。
每一层都有特定的功能和任务。
网络协议的实现和使用牵涉到各个层次的相关技术和配置。
1.2. HTTP协议HTTP协议是用于在Web浏览器和Web服务器之间传输超文本的协议。
它基于TCP/IP协议,并通过可靠的连接进行数据传输。
通过HTTP协议,我们可以实现网页的请求和响应,以及其他与Web相关的操作。
HTTP协议的实现和使用在今天的互联网中至关重要。
2. 实验目的本次实验的目的是:2.1. 理解和掌握各种网络协议的工作原理和应用场景;2.2. 通过实际操作验证网络协议的功能和效果;2.3. 探索网络协议在实际应用中的安全性和可靠性。
3. 实验过程3.1. 搭建实验环境在实验开始前,我们需要搭建一个适合的实验环境。
确保计算机网络的正常连接,并安装必要的软件和工具。
3.2. 实验一:TCP/IP协议实验在第一个实验中,我们将研究TCP/IP协议的工作原理,并进行一系列的实际操作。
首先,我们需要了解和配置网络接口层的相关参数。
接下来,我们将实现网络层和传输层的功能,包括IP地址的分配和路由的配置。
最后,我们将使用应用层协议进行数据传输,并验证其可靠性和效果。
3.3. 实验二:HTTP协议实验在第二个实验中,我们将以HTTP协议为例,研究应用层协议的工作流程和功能。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验一:unsigned short checkSum(char*pBuffer,int nLen){unsigned short nWord;unsigned int nSum=0;int i;for(i=0;i<nLen;i=i+2){nWord=((pBuffer[i]<<8)&0xFF00)+(pBuffer[i+1]&0xFF);nSum=nSum+(unsigned int)nWord;}while(nSum>>16){nSum=(nSum&0xFFFF)+(nSum>>16);}nSum=~nSum;return((unsigned short)nSum);}int timeout=1000;setsockopt(sock_raw,SOL_SOCKET,SO_RCVTIMEO,(char*)&timeout,sizeof(timeout));setsockopt(sock_raw,SOL_SOCKET,SO_SNDTIMEO,(char*)&timeout,sizeof(timeout)); ICMPheader*pIcmpHeader=(ICMPheader*)sendBuffer;pIcmpHeader->byType=8;pIcmpHeader->byCode=0;pIcmpHeader->nId=(USHORT)::GetCurrentProcessId();pIcmpHeader->nChecksum=0;pIcmpHeader->nSequence=htons(nSeq++);memset(sendBuffer+sizeof(ICMPheader),'*',32);pIcmpHeader->nChecksum=htons(checkSum(sendBuffer,sizeof(ICMPheader)+32));int nRet=sendto(sock_raw,sendBuffer,sizeof(ICMPheader)+32,0, (SOCKADDR*)&dest_addr,sizeof(SOCKADDR_IN));IPheader*ipHdr=(IPheader*)recvBuffer;ICMPheader*icmpHdrRet=(ICMPheader*)(recvBuffer+sizeof(IPheader));if(icmpHdrRet->byCode==0&&icmpHdrRet->nId==pIcmpHeader->nId&&icmpHdrRet->nSequence==pIcmpHeader->nSequence){nPacketReceived++;unsigned long dwRecvTime=::GetTickCount();int nRoundTime=dwRecvTime-dwSendTime;nTotalRoundTime+=nRoundTime;if(nMinRoundTime==-1){nMinRoundTime=nRoundTime;nMaxRoundTime=nRoundTime;}if(nRoundTime<nMinRoundTime){nMinRoundTime=nRoundTime;}if(nRoundTime>nMaxRoundTime){nMaxRoundTime=nRoundTime;}cout<<"Reply from "<<inet_ntoa(from_addr.sin_addr)<<": bytes = "<<nRet-sizeof(ICMPheader)-sizeof(IPheader)<<", time = "<<nRoundTime<<"ms, TTL = "<<(int)ipHdr->byTtl<<endl;}unsigned long dwSendTime=::GetTickCount();cout<<endl<<"Ping statistics for "<<inet_ntoa(from_addr.sin_addr)<<":"<<endl <<"\t"<<"Packets:sent = "<<nPacketSent<<", Received = "<<nPacketReceived<<", Lost = "<<(nPacketSent-nPacketReceived)<< "("<<((float)(nPacketSent-nPacketReceived)/nPacketSent)*100<<"% loss)"<< endl;if(nPacketReceived){cout<<"\rApproximate round trip times in milli-seconds:"<<endl<<'\t' <<"Minimum = "<<nMinRoundTime<<"ms, Maximum = "<<nMaxRoundTime<<"ms, Average = "<<(float)nTotalRoundTime/nPacketReceived<<"ms"<<endl;}实验二://此函数获取本机DNS服务器地址(为点分十进制计法的字符串形式),并保存到dnsServer中,这里需要Iphlpapi.h和IPHLPAPI.LIBvoid getDnsServer(char*dnsServer){//获得需要的缓冲区大小DWORD nLength=0;if(GetNetworkParams(NULL,&nLength)!=ERROR_BUFFER_OVERFLOW){return;}FIXED_INFO*pFixedInfo=(FIXED_INFO*)new BYTE[nLength];//获得本地计算机网络参数if(GetNetworkParams(pFixedInfo,&nLength)!=ERROR_SUCCESS){delete[]pFixedInfo;return;}IP_ADDR_STRING*pCurrentDnsServer=&pFixedInfo->DnsServerList;if(pCurrentDnsServer!=NULL){char*tmp=pCurrentDnsServer->IpAddress.String;//pCurrentDnsServer->IpAddress.String即为我们所需要的字符串形式的DNS服务器IP地址strcpy(dnsServer,tmp);}}//对域名字符串进行解析并进行形式的变换,例如将"\0"变成"3www4wust3edu2cn0x00"char*pTrace=hostname;char*pHostname=hostname;int iStrLen=strlen(hostname);unsigned char iCharNum=0;while(*pTrace!='\0')//指针移到最后并从最后一个字符'\0'开始,每个字符往后移一个字节{pTrace++;}while(pTrace!=hostname){*(pTrace+1)=*pTrace;pTrace--;}*(pTrace+1)=*pTrace;//把第一个字符移到第二个字符位置pTrace++;//此时第一个字符没有实际意义,将指针指向原字符串中第二个字符的位置while(*pTrace!='\0')//从第一个字符开始扫描,iCharNum统计每两个字符'.'之间的字符数,然后填入原来字符'.'的位置{if(*pTrace=='.'){*pHostname=iCharNum;iCharNum=0;pHostname=pTrace;}else{iCharNum++;}pTrace++;}*pHostname=iCharNum;//最后一个字符'.'之后的字符数写入,例如"3www6google3com.hk"中的".hk"for(int i=1;i<=iRespNum;i++){pTraceResponse+=sizeof(short);//指针跳过应答记录的“域名”字段,此“域名”字段一般为一个域名指针,以0xC0开始。
pResponse=(pRESPONSE)pTraceResponse;if(ntohs(pResponse->type)==1)//这条应答记录返回的是与之前查询所对应的IP地址{pTraceResponse+=sizeof(RESPONSE);unsigned long ulIP=*(unsigned long*)pTraceResponse;address.s_addr=ulIP;//获取IP地址信息保存到ulIP,并写入address 里面if(i==iRespNum)//最后一条记录显示句号,否则显示分号{printf("%s. ",inet_ntoa(address));}else{printf("%s; ",inet_ntoa(address));}pTraceResponse+=sizeof(long);//指针移过应答记录的IP地址字段,指向下一个应答记录}else if(ntohs(pResponse->type)==5)//这条应答记录为所查询主机的一个别名,这里本程序直接跳过这条记录{pTraceResponse+=sizeof(RESPONSE);pTraceResponse+=ntohs(pResponse->length);}}实验三:if((g_events[0]=WSACreateEvent())==WSA_INVALID_EVENT){printf("错误:WSACreateEvent failed with error %d\n",WSAGetLastError());return;}//操作临界区,防止出错EnterCriticalSection(&g_cs);//创建一个新的SOCKET_INF结构处理接受的数据socket.if((g_sockets[g_dwEventTotal]=(LPSOCKET_INF)GlobalAlloc(GPTR,sizeof(SOCKET_INF)))==NULL){printf("错误:GlobalAlloc() failed with error %d\n",GetLastError());return;}//初始化新的SOCKET_INF结构char buff[DATA_BUFSIZE];memset(buff,0,DATA_BUFSIZE);g_sockets[g_dwEventTotal]->wsaBuf.buf=buff;g_sockets[g_dwEventTotal]->wsaBuf.len=DATA_BUFSIZE;g_sockets[g_dwEventTotal]->s=sAccept;memset(&(g_sockets[g_dwEventTotal]->o),0,sizeof(OVERLAPPED));g_sockets[g_dwEventTotal]->dwBytesSend=0;g_sockets[g_dwEventTotal]->dwBytesRecv=0;g_sockets[g_dwEventTotal]->nStatus=WSA_RECV;// 接收//创建事件if((g_sockets[g_dwEventTotal]->o.hEvent=g_events[g_dwEventTotal]= WSACreateEvent())==WSA_INVALID_EVENT){printf("WSACreateEvent() failed with error %d\n",WSAGetLastError());return;}//发出接受请求dwFlags=0;if(WSARecv(g_sockets[g_dwEventTotal]->s,&(g_sockets[g_dwEventTotal]->wsaBuf),1,&dwRecvBytes,&dwFlags,&(g_sockets[g_dwEventTotal]->o),NULL)==SOCKET_ERROR){if(WSAGetLastError()!=ERROR_IO_PENDING){printf("错误:WSARecv() failed with error %d\n",WSAGetLastError());return;}}g_dwEventTotal++;//离开临界区LeaveCriticalSection(&g_cs);if(strstr(szCmd,"PORT")){if(ConvertDotAddress(pSI->buffRecv+strlen("PORT")+1,&dwIpAddr,&wPort)== -1)return-1;const char*szPortCmdOK="200 PORT Command successful.\r\n";sprintf(pSI->buffSend,"%s",szPortCmdOK);if(SendRes(pSI)==-1)return-1;bPasv=FALSE;return CMD_OK;}if(strstr(szCmd,"PASV")){if(DataConn(s,htonl(INADDR_ANY),PORT_BIND,MODE_PASV)==-1) return-1;char*szCommaAddress=ConvertCommaAddress(GetLocalAddress(),PORT_BIND);sprintf(pSI->buffSend,"227 Entering Passive Mode(%s).\r\n",szCommaAddress);if(SendRes(pSI)==-1)return-1;bPasv=TRUE;return PASSIVE_MODE;}int ConvertDotAddress(char*szAddress,LPDWORD pdwIpAddr,LPWORD pwPort) {int idx=0,i=0,iCount=0;char szIpAddr[MAX_ADDR_LEN];memset(szIpAddr,0,sizeof(szIpAddr));char szPort[MAX_ADDR_LEN];memset(szPort,0,sizeof(szPort));*pdwIpAddr=0;*pwPort=0;while(szAddress[idx]){if(szAddress[idx]==','){iCount++;szAddress[idx]='.';}if(iCount<4)szIpAddr[idx]=szAddress[idx];elseszPort[i++]=szAddress[idx];idx++;}if(iCount!=5)return-1;*pdwIpAddr=inet_addr(szIpAddr);if(*pdwIpAddr==INADDR_NONE)return-1;char*pToken=strtok(szPort+1,".");if(pToken==NULL)return-1;*pwPort=(WORD)(atoi(pToken)*256);pToken=strtok(NULL,".");if(pToken==NULL)return-1;*pwPort+=(WORD)atoi(pToken);return0;}char*ConvertCommaAddress(char*szAddress,WORD wPort){char szPort[10];sprintf(szPort,"%d,%d",wPort/256,wPort%256);char szIpAddr[20];sprintf(szIpAddr,"%s,",szAddress);int idx=0;while(szIpAddr[idx]){if(szIpAddr[idx]=='.')szIpAddr[idx]=',';idx++;}sprintf(szAddress,"%s%s",szIpAddr,szPort);return szAddress;}。