《网络编程与协议分析》课程设计报告
- 格式:docx
- 大小:1.14 MB
- 文档页数:22
网络编程实训课程学习总结开发网络应用与通信协议网络编程是计算机科学中的一个重要分支,通过网络编程,我们可以实现各种各样的功能,比如开发网络应用和通信协议。
在进行网络编程的学习过程中,我深刻领悟到了网络编程的重要性以及其中的一些技术要点,下面我将对我的学习经历进行总结。
首先,在网络编程实训课程中,我学习了网络编程的基础知识。
网络编程是一门涉及到多方面技术的学科,要想在这个领域有所建树,必须要掌握基本的网络概念和相关的技术。
在实训课程中,我们首先学习了TCP/IP协议,这是互联网最基础的通信协议,也是网络编程的基础。
通过学习TCP/IP协议,我深入理解了网络通信的原理和关键技术,掌握了socket编程的基本方法和技巧。
我们还学习了HTTP和FTP等应用层协议,了解了它们的工作原理和应用场景。
其次,我在网络编程实训课程中学习了几种常用的编程语言和框架。
在实际的网络编程中,我们需要使用一些编程语言和框架来实现具体的功能。
在课程中,我们学习了Java和Python这两种常用的编程语言,它们在网络编程中都有广泛的应用。
我们学习了Java的Socket编程和Python的Twisted框架,通过实践项目,我掌握了使用这两种语言进行网络编程的基本技能。
此外,我们还学习了一些Web开发框架,比如Django和Flask,这些框架可以帮助我们快速开发具有网络功能的应用。
网络编程实训课程还涉及了一些进阶的主题,比如网络安全和性能优化。
网络安全是在进行网络编程时必须要重视的问题,我们学习了一些常见的网络攻击方式和防范措施,学习了一些加密和认证的方法。
性能优化是在开发网络应用时需要考虑的问题,我们学习了一些优化的技巧和策略,比如使用缓存、优化数据库查询等。
通过网络编程实训课程的学习,我对网络编程有了更深入的理解和掌握。
我学会了使用各种编程语言和框架来进行网络编程,能够独立地开发一些简单的网络应用和通信协议。
同时,我也了解了网络编程领域的一些前沿技术和发展趋势,为以后的学习和研究打下了基础。
网络协议分析课程设计之协议编程实验一帧封装实验目的:•编写程序,根据给出的原始数据,组装一个IEEE 802.3格式的帧(题目)默认的输入文件为二进制原始数据(文件名分别为input1和input2))。
•要求程序为命令行程序。
比如,可执行文件名为framer.exe,则命令行形式如下:framer inputfile outputfile,其中,inputfile为原始数据文件,outputfile为输出结果。
•输出:对应input1和input2得结果分别为output1和output2。
试验要求:•编写程序,根据给出的原始数据,组装一个IEEE 802.3格式的帧(题目)默认的输入文件为二进制原始数据(文件名分别为input1和input2))。
•要求程序为命令行程序。
比如,可执行文件名为framer.exe,则命令行形式如下:framer inputfile outputfile,其中,inputfile为原始数据文件,outputfile为输出结果。
输出:对应input1和input2得结果分别为output1和output2验设计相关知识:帧:来源于串行线路上的通信。
其中,发送者在发送数据的前后各添加特殊的字符,使它们成为一个帧。
Ethernet从某种程度上可以被看作是机器之间的数据链路层连接。
按802.3标准的帧结构如下表所示(802.3标准的Ethernet帧结构由7部分组成)802.3标准的帧结构其中,帧数据字段的最小长度为46B 。
如果帧的LLC 数据少于46B ,则应将数据字段填充至46B 。
填充字符是任意的,不计入长度字段值中。
在校验字段中,使用的是CRC 校验。
校验的范围包括目的地址字段、源地址字段、长度字段、LLC 数据字段。
循环冗余编码(CRC)是一种重要的线性分组码、编码和解码方法,具有简单、检错和纠错能力强等特点,在通信领域广泛地用于实现差错控制。
CRC 校验码的检错能力很强,不仅能检查出离散错误,还能检查出突发错误。
网络协议课程设计一、课程目标知识目标:1. 学生能够理解网络协议的基本概念,掌握TCP/IP协议簇的核心协议工作原理;2. 学生能够描述不同网络层(如物理层、数据链路层、网络层、传输层等)的主要协议及其功能;3. 学生能够解释域名系统(DNS)、动态主机配置协议(DHCP)等应用层协议的工作流程。
技能目标:1. 学生能够运用所学知识分析网络通信中的问题,并能够选择合适的网络协议进行解决;2. 学生通过案例学习,能够模拟设计简单的网络通信协议,提升实际操作能力;3. 学生能够利用网络协议知识配置基本的网络设备,进行网络故障排查。
情感态度价值观目标:1. 培养学生对网络协议的兴趣,激发他们探索网络通信领域的热情;2. 学生通过学习网络协议,认识到网络技术对社会发展的重要性,增强社会责任感和团队合作精神;3. 学生在学习过程中,能够遵循网络安全规范,树立正确的网络道德观念。
课程性质:本课程为计算机网络基础知识课程,旨在帮助学生建立网络协议的基本观念,提高实际操作能力。
学生特点:学生为初中年级,具备一定的计算机操作基础,对网络知识有一定的好奇心,但缺乏系统的网络协议知识。
教学要求:结合学生特点,注重理论与实践相结合,采用案例分析、小组合作等教学方法,使学生在掌握知识的同时,提高实际操作和团队协作能力。
通过明确具体的课程目标,为教学设计和评估提供依据。
二、教学内容1. 网络协议基本概念:介绍协议的定义、作用和分类,以课本第二章第一节为基础,使学生理解网络协议的重要性。
- 协议的定义与作用- 协议的分类与层次结构2. TCP/IP协议簇:分析TCP/IP协议簇的四大层(网络接口层、网络层、传输层、应用层),结合课本第二章第二节,重点讲解各层的主要协议。
- 网络接口层与数据链路层协议- 网络层协议(IP、ICMP等)- 传输层协议(TCP、UDP等)- 应用层协议(HTTP、FTP、SMTP、DNS等)3. 网络协议配置与故障排查:以课本第二章第三节为例,教授如何配置网络设备,进行网络故障排查。
HUNAN CITY UNIVERSITY网络协议编程课程设计说明书设计题目:基于MFC框架的Echo协议模拟软件的设计与实现专业:网络工程学生姓名:*****班级学号:1206101-28分组成员: 1206101-05 *****、1206101-31******1206101-28何***指导教师:****老师*****老师2015 年 07月 03日《网络协议编程课程设计》说明书学号:1206101-28姓名:****一、设计时间2015年06月29日-----07月03日。
二、设计地点湖南城市学院信息楼507机房。
三、设计目的1、巩固《网络协议编程》课程涉及的基本知识,培养灵活运用知识进行独立设计的能力;2、掌握TCP/IP网络程序框架、Winsock API、高级网络编程API的使用;3、提高综合运用所学的理论知识独立分析和解决问题的能力;4、进一步熟悉利用Visual C++6.0进行开发的能力;5、培养查阅资料,独立思考问题的能力。
四、设计小组成员1206101-05**** 1206101-31**** 1206101-28****五、指导老师****老师、****老师。
六、设计课题经过小组组员的讨论,决定选取选题(18 基于MFC框架的Echo协议模拟软件的设计与实现),编写一个基于MFC框架的Echo协议模拟软件。
理由:1、Echo协议(也称回声协议)是一个非常简单的协议,它主要用于网络可达性的检测中。
2、该系统功能相对简单,易于实现,适于初学者。
3、该系统牵涉到TCP协议、CAsysncSocket类、C/S模式以及MFC框架,采用VC6.0编制程序模拟Echo协议的基本功能,需要灵活运用这些知识解决实际问题,有利于培养网络系统开发的实际动手能力。
七、基本思路及关键问题的解决方法本系统的开发采用基于MFC的Echo协议的C/S模式,服务器在端口7检测接收到的信息,如果收到信息,则原封不动地重发回客户端。
网络协议编程课程设计java一、课程目标知识目标:1. 让学生理解网络协议编程的基本概念,掌握Java语言实现网络编程的方法;2. 使学生掌握TCP/IP协议族的原理,了解不同网络协议的特点和应用场景;3. 引导学生掌握套接字编程技术,学会使用Java语言实现客户端与服务器端的数据传输。
技能目标:1. 培养学生运用Java语言编写网络应用程序的能力,学会使用套接字进行网络通信;2. 培养学生分析、解决网络编程中遇到的问题,提高实际编程能力;3. 培养学生团队协作能力,学会共同开发、调试网络应用程序。
情感态度价值观目标:1. 培养学生热爱编程,对网络协议编程产生浓厚兴趣;2. 培养学生积极探究、主动学习的精神,敢于面对编程过程中的困难与挑战;3. 引导学生树立正确的网络安全意识,认识到网络协议编程在实际应用中的重要性。
本课程针对高年级学生,具备一定的Java编程基础和网络知识。
课程性质为理论与实践相结合,注重培养学生的实际编程能力。
教学要求学生在理解网络协议原理的基础上,通过实际编程实践,掌握Java网络编程技术,培养解决实际问题的能力。
课程目标的设定旨在使学生能够达到上述学习成果,为后续深入学习网络编程打下坚实基础。
二、教学内容1. 网络协议编程基本概念:介绍网络编程的背景、意义,对比不同网络协议,如TCP、UDP、HTTP等,分析各自优缺点及适用场景。
教材章节:第1章 网络编程概述2. Java网络编程基础:讲解Java网络编程的核心类库,如包,重点介绍InetAddress、Socket、ServerSocket等类的使用方法。
教材章节:第2章 Java网络编程基础3. 套接字编程:详细讲解套接字编程原理,包括TCP套接字和UDP套接字的使用,举例说明如何实现客户端与服务器端的数据传输。
教材章节:第3章 套接字编程4. 多线程网络编程:介绍多线程在网络编程中的应用,学会使用Java多线程实现并发网络通信,提高程序性能。
网络编程协议课程设计一、课程目标知识目标:1. 理解网络编程协议的基本概念和作用;2. 掌握常见的网络协议(如TCP/IP、HTTP、FTP等)的工作原理和特点;3. 了解网络编程中数据传输、连接建立和维护的相关知识;4. 学会运用网络编程协议解决实际问题。
技能目标:1. 能够运用所学知识,编写简单的网络应用程序;2. 能够熟练使用网络协议分析工具,对网络数据进行抓包和分析;3. 能够诊断和解决网络编程中遇到的问题;4. 提高团队协作和沟通能力,通过小组讨论和实践,共同完成网络编程项目。
情感态度价值观目标:1. 培养学生对网络编程的兴趣,激发学习热情;2. 培养学生的创新意识和实践能力,敢于尝试新方法解决问题;3. 增强学生的网络安全意识,遵守网络道德规范,尊重他人隐私;4. 培养学生的团队协作精神,提高沟通能力和责任感。
本课程针对高中年级学生,结合网络编程协议的知识深度,旨在帮助学生掌握网络编程的基本知识和技能,培养他们运用网络编程解决实际问题的能力。
课程目标具体、可衡量,以便学生和教师在教学过程中能够清晰地了解课程的预期成果。
通过分解课程目标为具体的学习成果,教师可以更好地进行教学设计和评估,提高课程的实用性和有效性。
二、教学内容1. 网络编程基础理论- 网络协议概念与分层模型- 网络编程的基本概念与编程接口2. 常见网络协议及其工作原理- TCP/IP协议族:IP协议、TCP协议、UDP协议- 应用层协议:HTTP协议、FTP协议、SMTP协议、DNS协议3. 网络编程实践- 套接字编程:基于TCP和UDP的网络应用程序编写- 网络数据传输:数据编码与解码、数据完整性校验- 网络应用案例分析:简单聊天室、文件传输等4. 网络编程调试与分析- 网络抓包工具:Wireshark的使用方法- 网络编程问题诊断与调试技巧5. 网络编程项目实战- 项目规划与分工- 项目实施与进度控制- 项目展示与评价教学内容依据课程目标进行选择和组织,注重科学性和系统性。
计算机网络课程设计报告课程设计项目名称:网络协议与应用程序设计系:专业::实验地点:实验日期:一、目的与要求基于典型的网络协议和网络应用的源代码进行分析,通过本科目,使学员了解网络通信流程,掌握网络通信程序的设计以及通信协议的应用技能,培养学员网络协议与网络应用的设计实现能力。
二、实验环境Visual C++6.0三、程序设计3.1 IP报头格式typedef struct tagIPINFO{u_char Ttl; // Time To Liveu_char Tos; // Type Of Serviceu_char IPFlags; // IP flagsu_char OptSize; // Size of options datau_char FAR *Options; // Options data buffer}IPINFO, *PIPINFO生存时间+服务类型+标识字段+数据报大小+数据报缓存区3.2 ICMP报头格式typedef struct tagICMPECHO{u_long Source; // Source addressu_long Status; // IP statusu_long RTTime; // Round trip time in millisecondsu_short DataSize; // Reply data sizeu_short Reserved; // Unknownvoid FAR *pData; // Reply data bufferIPINFO ipInfo; // Reply options}ICMPECHO, *PICMPECHO;源地址+IP状态+往返延迟+返回数据大小+未知接受数据+返回数据缓存+返回IP报头数据函数流程设计//初始化模块:初始化全局标量,初始化加载库。
void main(int argc, char **argv){WSADATA wsaData; // WSADATAICMPECHO icmpEcho; // ICMP Echo reply bufferHANDLE hndlIcmp; // LoadLibrary() handle to ICMP.DLL HANDLE hndlFile; // Handle for IcmpCreateFile() LPHOSTENT pHost; // Pointer to host entry structurestruct in_addr iaDest; // Internet address structure DWORD *dwAddress; // IP Addressint nRet; // General use return codeIPINFO ipInfo; // IP Options structureDWORD dwRet; // DWORD return codeint x;// Check argumentsif (argc != 2){fprintf(stderr,"\nSyntax: pingi HostNameOrIPAddress\n");return;}// Dynamically load the ICMP.DLLhndlIcmp = LoadLibrary("ICMP.DLL");if (hndlIcmp == NULL){fprintf(stderr,"\nCould not load ICMP.DLL\n");return;}// Retrieve ICMP function pointerspIcmpCreateFile = (HANDLE (WINAPI *)(void))GetProcAddress(hndlIcmp,"IcmpCreateFile");pIcmpCloseHandle = (BOOL (WINAPI *)(HANDLE))GetProcAddress(hndlIcmp,"IcmpCloseHandle");pIcmpSendEcho = (DWORD (WINAPI *)(HANDLE,DWORD,LPVOID,WORD,PIPINFO,LPVOID,DWORD,DWORD))GetProcAddress(hndlIcmp,"IcmpSendEcho");// Check all the function pointers//功能控制模块:计算校验和填充数据报文、释放占用资源。
网络编程基础技术实验报告一、实验目的与要求本次实验旨在使学生掌握网络编程的基本概念,理解TCP/IP协议栈的工作原理,并通过编程实践加深对网络通信过程的理解。
学生需要编写一个简单的网络通信程序,实现客户端与服务器之间的数据传输。
二、实验环境与工具实验环境为Windows操作系统,开发工具选择Visual Studio 2019,编程语言使用C++。
三、实验内容与步骤1. 服务器端程序设计:- 创建一个Socket,绑定到指定端口。
- 监听客户端的连接请求。
- 接受客户端连接,创建一个新的Socket用于通信。
- 接收客户端发送的数据,并将其回显给客户端。
- 关闭连接,释放资源。
2. 客户端程序设计:- 创建一个Socket,连接到服务器指定的IP地址和端口。
- 向服务器发送数据请求。
- 接收服务器回显的数据。
- 关闭连接,释放资源。
四、实验代码实现以下是服务器端和客户端程序的代码实现示例:服务器端代码(Server.cpp):```cpp#include <winsock2.h>#include <windows.h>#pragma comment(lib, "ws2_32.lib")int main() {WSADATA wsaData;SOCKET serverSocket, clientSocket;struct sockaddr_in serverAddr, clientAddr;int clientAddrLen = sizeof(clientAddr);char buffer[1024];WSAStartup(MAKEWORD(2, 2), &wsaData);serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); serverAddr.sin_family = AF_INET;serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);serverAddr.sin_port = htons(8888);bind(serverSocket, (SOCKADDR*)&serverAddr,sizeof(serverAddr));listen(serverSocket, 5);while (true) {clientSocket = accept(serverSocket,(SOCKADDR*)&clientAddr, &clientAddrLen);recv(clientSocket, buffer, sizeof(buffer), 0);send(clientSocket, buffer, strlen(buffer), 0);closesocket(clientSocket);}closesocket(serverSocket);return 0;}```客户端代码(Client.cpp):```cpp#include <winsock2.h>#include <windows.h>#pragma comment(lib, "ws2_32.lib")int main() {WSADATA wsaData;SOCKET clientSocket;struct sockaddr_in serverAddr;char buffer[1024];WSAStartup(MAKEWORD(2, 2), &wsaData);clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); serverAddr.sin_family = AF_INET;serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");serverAddr.sin_port = htons(8888);connect(clientSocket, (SOCKADDR*)&serverAddr,sizeof(serverAddr));strcpy_s(buffer, "Hello, Server!");send(clientSocket, buffer, strlen(buffer), 0);recv(clientSocket, buffer, sizeof(buffer), 0);closesocket(clientSocket);return 0;}```五、实验结果与分析实验结果表明,客户端成功连接到服务器,并向服务器发送了数据。
如何进行网络协议设计和网络编程网络协议设计和网络编程是计算机网络领域的关键技术,是保障网络通信安全和效率的重要手段。
下面将结合网络协议设计和网络编程分别进行详细说明。
一、网络协议设计1.定义目标:在设计网络协议时,首先需要明确协议的目标,包括实现网络通信的功能、确保通信的安全性、提高通信效率等。
2.分层设计:网络协议的设计通常采用分层设计的方式,常见的网络协议分层有物理层、数据链路层、网络层、传输层和应用层等。
不同层次的协议需遵循各自的规范和标准,实现相互之间的通信和协作。
3.协议规范:设计网络协议需要明确协议的各种规范,包括数据格式、报文结构、传输方式、状态机等。
规范的设计和定义需要考虑到协议的灵活性、可扩展性和兼容性等方面。
4.安全性考虑:在设计网络协议时,安全性是一个至关重要的考虑因素。
需要通过加密算法、认证机制、访问控制等手段来确保通信的安全性,防止数据泄露和攻击。
5.性能优化:为了提高网络通信的效率,设计网络协议时需要考虑性能优化的问题,包括减少数据传输延迟、降低网络拥塞、提高带宽利用率等。
6.测试和验证:在设计完网络协议后,需要进行测试和验证,确保协议的正确性和稳定性。
可以通过模拟环境、实验测试等手段来验证协议的功能和性能。
二、网络编程1.选择编程语言:网络编程可以使用多种编程语言实现,常见的有C、C++、Java、Python等。
根据需求和项目的特点选择合适的编程语言进行开发。
2.使用Socket编程:网络编程中常用的技术是Socket编程,通过Socket可以实现网络通信,包括TCP和UDP通信。
可以利用Socket API来实现网络客户端和服务器端的通信。
3.设计网络应用:在进行网络编程时,需要先设计网络应用的功能和架构,包括客户端和服务器端的交互方式、数据传输格式、错误处理等。
4.异步编程:网络编程中常常需要处理并发和异步操作,可以利用多线程、异步IO等技术来实现并发处理,提高网络应用的性能和响应速度。
西安郵電大學网络协议分析与仿真课程设计报告书院系名称:计算机学院实验内容:网络流量分析学生姓名:专业名称:网络工程班级:学号:时间:2012年12月15日网络协议分析与仿真课程设计报告网络流量分析一、课程设计目的加深对IP、DSN 、TCP、UDP、HTTP等协议的理解;掌握流量分析工具的使用,学习基本的流量分析方法。
二、课程设计内容流量分析工具:Wireshark(Windows或Linux),tcpdump(Linux)要求:使用过滤器捕获特定分组;用脚本分析大量流量数据(建议用perl)。
内容:Web流量分析清除本机DNS缓存,访问某一网站主页,捕获访问过程中的所有分组,分析并回答下列问题(以下除1、3、8、11外,要求配合截图回答):(1)简述访问web页面的过程。
(2)找出DNS解析请求、应答相关分组,传输层使用了何种协议,端口号是多少?所请求域名的IP地址是什么?(3)统计访问该页面共有多少请求IP分组,多少响应IP分组?(提示:用脚本编程实现)(4)找到TCP连接建立的三次握手过程,并结合数据,绘出TCP连接建立的完整过程,注明每个TCP报文段的序号、确认号、以及SYN\ACK的设置。
(5)针对(4)中的TCP连接,该TCP连接的四元组是什么?双方协商的起始序号是什么?TCP连接建立的过程中,第三次握手是否带有数据?是否消耗了一个序号?(6)找到TCP连接的释放过程,绘出TCP连接释放的完整过程,注明每个TCP 报文段的序号、确认号、以及FIN\ACK的设置。
(7)针对(6)中的TCP连接释放,请问释放请求由服务器还是客户发起?FIN 报文段是否携带数据,是否消耗一个序号?FIN报文段的序号是什么?为什么是这个值?(8)在该TCP连接的数据传输过程中,找出每一个ACK报文段与相应数据报文段的对应关系,计算这些数据报文段的往返时延RTT(即RTT样本值)。
根据课本200页5.6.2节内容,给每一个数据报文段估算超时时间RTO。
武汉科技大学计算机科学与技术学院制表说明:本合同资料适用于约定双方经过谈判、协商而共同承认、共同遵守的责任与义务,同时阐述确定的时间内达成约定的承诺结果。
文档可直接下载或修改,使用时请详细阅读内容。
课程名称:网络编程与协议分析)叔1善科技尤•学Wuhan University of Science & Technology计算机科学与技术学院课程设计报告课程名称:网络编程与协议分析专业:_____________________班级:_____________________学号:_____________________姓名:_____________________指导老师:_____________________《网络编程与协议分析》课程设计报告、课设题目:网络数据包抓取与分析软件、课设要求:1)能抓取本地主机所在局域网子网内的所有数据包2)分析并显示所抓取数据包的IP头部各字段的信息3)分析并显示所抓取数据包的封装在IP数据包内的协议头部字段信息(TCP、UDP、ICMP 等)4)生成日志信息,以文本文档形式保存5)分析并显示所抓取数据包应用层协议头部字段信息(HTTP、FTP、DNS、Telnet、SMTP、POP等各种应用层协议中至少取三种)三、用到的基本概念及原理(1)UDP协议介绍UDP协议的全称是用户数据报协议,在网络中它与TCP协议一样用于姓理数据包;在OSI模型中.在第四层——传辕层,处于IP协议的上一层’ UDP有不提供数据报分组、组装和不能对数据包的排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的’UDP用来支持那些需要在计算机之间传蜿数据的网络应用;包括阿络视频会议系统在内的众多的客户.眼务器模式的网络应用都需要使用UDP协议=UDP协议从问世至今已经被使用了很寥年,虽然其最初的光彩已经被一些类似协议所掩盖,但是即使是在今天,LT>P仍然不失为一项非常实用和可行的网络传输层协议:(2)TCP协议基本知识TCP是一种面向连凄(连接导向)的、可翥的、基于字节流的运输层通信协议’在OSIRM模型中,它完成第四层传输层所指定的功能,UDP 是同一层内另一个重要的传输协议・首先,TCP建立连接之后,通信祖方都同时可以进行数据的传输.其次,他是全祖工的*在保证可靠性上,采用超时重传和稍待确认机制,在流量控制上,采用滑动窗口协议,协议中规定.对于窗口内未经确认的分组需要重传=在拥塞控制上,采用慢启动算法.(3) Winpcap的组成和结构WinPcap由一个数据包监听设备驱动程序(NPF)、一个底层的动态连接库(packet, dll)和一个高层的不依赖于操作系统的静态库(■口can d匚)共三个部分构成,如图2・5所示=这里,XPF在操作系统的内核级,packet. dlL叩cap. dll 在用户级.(4) Winpcap基本原理数据包过滤器•数据包过滤器决定是否接收进来的数据包并把数据包拷贝给骁听程序:■数据包过波器是一个有布尔输出的函数=循环缱冲区』循环援冲区以队列插入的方式来保存数据包,提高数据的存睹致率■:WinPcap 引用:到 http: winpcap, org devel. htm下载V.'inPcap 4, 0. 2. zip- 后群压,锌压缠就可以看见Include 和lib;在“ProjnctfSettingm*标签栏中选择 "C 在 ^Preprocessor definitions'"的输入框里添加"WPCAP”;再选舞"Link"?在"Object library modules^的输入框里添加lib " ° 然后再设置TO+环境变量:选择Tools->optians->Directories的include里面和入下载的winpcap开发包修压以后的include文件夹@ 选择Tocls->opt ions-) Direct ones的lib里面加入下载的winpcap开发包程玉以后的lib 件夹:■在 stdafs 中加入+tinclLide <pcap. h>(5) NPF在windows系统中的位置、FF是一个协议驱动:从性能方面来看,这不是最好的选择,但是它合理地独立于MAC层并且有权使用原始通信- traffic).可以看出,XPF在NDIS之上,它与TCP IP协议栈的实现在同一层次,因此,应用程序不通过Winsock也可以实现数据的发送和接受。
网络协议分析课程设计心得一、课程目标知识目标:1. 让学生理解网络协议的基本概念,掌握常见的网络协议及其工作原理;2. 使学生掌握网络协议分析的方法和技巧,能够分析网络数据包,解读协议内容;3. 引导学生了解网络协议在网络安全中的作用,提高网络安全意识。
技能目标:1. 培养学生运用网络抓包工具进行数据包捕获和分析的能力;2. 培养学生运用网络协议分析技术解决实际问题的能力;3. 提高学生网络协议配置和调试的技能。
情感态度价值观目标:1. 培养学生对网络协议的兴趣,激发他们探索网络世界的热情;2. 培养学生严谨、细致的学习态度,提高他们分析问题和解决问题的能力;3. 增强学生的团队合作意识,培养他们在合作中学习、共同进步的精神。
课程性质:本课程为计算机网络技术相关专业的基础课程,旨在帮助学生建立网络协议知识体系,提高网络协议分析能力。
学生特点:学生已具备一定的计算机网络基础知识,对网络协议有一定了解,但分析能力和实践经验不足。
教学要求:结合学生特点,注重理论与实践相结合,以案例分析为主线,引导学生掌握网络协议分析方法,提高实践能力。
在教学过程中,关注学生的学习进度和反馈,及时调整教学策略,确保课程目标的达成。
将课程目标分解为具体的学习成果,为后续教学设计和评估提供依据。
二、教学内容1. 网络协议基本概念:介绍网络协议的定义、作用和分类,分析各类协议的特点及应用场景。
教材章节:第一章 网络协议概述2. 常见网络协议及其工作原理:详细讲解TCP/IP协议族、HTTP、FTP、SMTP等常见协议的工作原理。
教材章节:第二章 TCP/IP协议族,第三章 应用层协议3. 网络协议分析方法和技巧:介绍Wireshark等网络抓包工具的使用方法,教授如何捕获和分析网络数据包。
教材章节:第四章 网络协议分析4. 网络安全与协议分析:探讨网络协议在网络安全中的作用,分析常见网络攻击手段及防御策略。
教材章节:第五章 网络安全与协议分析5. 实践操作与案例分析:组织学生进行实际操作,通过案例分析加深对网络协议分析的理解。
网络协议解析与设计现代社会中,网络已成为人们生活中不可或缺的一部分。
无论是日常生活还是工作学习,我们都离不开网络的支持。
而网络的运行离不开网络协议的支持,网络协议负责规定数据在网络中的传输方式和格式,以保证网络的正常运行。
本文将探讨网络协议的解析与设计。
一、网络协议的概念和作用网络协议是计算机网络中用于数据传输的一套规则和约定。
它定义了数据通信的格式、数据的编码方式以及数据传输的方式等。
它的作用主要有以下几点:1. 数据传输:网络协议规定了数据在网络中传输的方式和格式,确保数据能够准确、安全、高效地传输。
2. 数据编码和解码:网络协议定义了数据在网络中的编码方式,保证数据能够正确地被接收方解析。
3. 错误检测和纠正:网络协议能够检测数据传输过程中可能出现的错误,并通过一定的机制进行纠正,保证数据的完整性和准确性。
二、网络协议的层次结构为了更好地组织和管理网络协议,人们将其划分为不同的层次,每个层次负责不同的功能。
常见的网络协议层次结构有OSI七层模型和TCP/IP四层模型。
1. OSI七层模型:- 物理层:负责传输比特流,将电信号转换为比特流。
- 数据链路层:负责将比特流转换为数据帧,并检测和纠正传输错误。
- 网络层:负责将数据帧从源地址传输到目的地址。
- 传输层:负责建立、维护和终止网络连接,并提供可靠的数据传输服务。
- 会话层:负责建立、维护和终止网络会话。
- 表示层:负责数据的格式转换和加密解密。
- 应用层:负责向用户提供服务,如FTP、HTTP等。
2. TCP/IP四层模型:- 网络接口层(物理层和数据链路层的组合):负责将数据转换为比特流、建立和维护网络连接。
- 网络层:负责将数据从源地址传输到目的地址,实现路由功能。
- 传输层:负责建立、维护和终止网络连接,并提供可靠的数据传输服务,如TCP、UDP等。
- 应用层:负责向用户提供服务,如HTTP、DNS等。
三、网络协议解析与设计网络协议的解析与设计是指对现有的网络协议进行分析、理解并设计新的协议。
目录1.课程设计目的 ---------------------------------------------------- 22.课程设计要求 ---------------------------------------------------- 23.课程设计题目分析 ------------------------------------------------ 23.1 网卡设置 -------------------------------------------------- 23.2 程序设计 -------------------------------------------------- 33.2.1 使用原始套接字------------------------------------------ 33.2.2 接收数据包---------------------------------------------- 43.2.3 定义IP头部的数据结构---------------------------------- 43.2.4 IP包的解析 --------------------------------------------- 54.解析IP数据包设计相关知识 -------------------------------------- 55.程序流程图------------------------------------------------------- 66.程序设计--------------------------------------------------------- 76.1 协议的定义 ------------------------------------------------ 76.2捕获处理--------------------------------------------------- 76.3 运行界面 -------------------------------------------------- 87.实验结果--------------------------------------------------------- 98.自我评析和总结 -------------------------------------------------- 98.1 实训心得-------------------------------------------------- 98.2 实训日记-------------------------------------------------- 99.主要参考资料 -------------------------------------------------- 10[2]《网络协议分析》寇晓蕤罗俊勇编著机械工业出版社--------- 10[3]《C语言程序设计》张建伟李秀琴主编科学出版社--------- 10[4]《C++程序设计教程——面向对象分册》郑秋生主编 --------- 10电子工业出版社 -------------------------------------------------- 10 10.附录 ---------------------------------------------------------- 101.课程设计目的本次实训的目的就是设计一个解析IP数据包的程序,并根据这个程序,说明IP数据包的结构及IP协议的相关问题,从而对IP层的工作原理有更好的理解和认识。
编程实现简单的TCP协议分析器一、问题描述编程实现简单的TCP协议分析器,TCP协议分析器是一种用于监督和跟踪网络活动的诊断工具,它从局域网中抓取IP数据包,并对它进行分析得到相应的头部信息,过滤TCP包进行分析,得到TCP包的相应信息。
二、基本要求1.利用原始套接字实现简单的TCP协议分析器。
2.系统功能包括:2.1 原始套接字与网卡绑定,并接收流经网卡的所有数据包;2.2 对数据包进行分析以获得源IP地址和目的IP地址;2.3 对TCP Segment进行分析以获得其首部详细信息;2.4 显示分析结果。
3 建议使用VC++。
三、设计思想TCP协议的数据传送程序是由二个子程序组成的。
也可以看成是服务器端程序和客户端程序,其中:服务器端程序的功能是侦听端口号,接收远程主要的TCP连接申请,并接收远程主机传送来的文字数据。
另外一个子程序,也就是所谓的客户端程序,主要实现向网络的远程主机提出TCP连接申请。
程序利用原始套接字抓取局域网中的IP包。
TCP协议分析器实现了sniffer的一部分功能。
而sniffer的工作原理是:1. 把网卡置于混杂模式;2. 捕获数据包;3. 分析数据包。
Raw Socket: 原始套接字可以用它来发送和接收 IP 层以上的原始数据包, 如 ICMP, TCP, UDP等。
四、系统结构(1)Pcap_addr描述网络接口地址;(2)pcap_pkthdr用来描述每个捕获到的数据包的基本信息;(3)int_pcaplookupnet获取网络地址和网络掩码;(4)int_pcaploop循环捕获网络数据包,直到遇到错误或满足退出条件;(5)pcap_t* pcap_open_dead构造一个libpcap句柄。
五、程序流程(或模块划分)六、源程序#include "pcap.h"struct ether_header{u_int8_t ether_dhost[6];/* 目的以太网地址*/u_int8_t ether_shost[6];/* 源以太网地址*/u_int16_t ether_type;/* 以太网类型*/};struct arp_header{u_int16_t arp_hardware_type;/* 硬件类型*/u_int16_t arp_protocol_type;/* 协议类型*/u_int8_t arp_hardware_length;/* 硬件地址长度*/u_int8_t arp_protocol_length;/* 协议地址长度*/u_int16_t arp_operation_code;/* 操作码*/u_int8_t arp_source_ethernet_address[6];/* 源以太网地址*/u_int8_t arp_source_ip_address[4];/* 源IP地址*/u_int8_t arp_destination_ethernet_address[6];/* 目的以太网地址*/u_int8_t arp_destination_ip_address[4];/* 目的IP地址*/};struct ip_header{#if defined(WORDS_BIGENDIAN)u_int8_t ip_version: 4,/* 版本*/ip_header_length: 4;/* 首部长度*/#elseu_int8_t ip_header_length: 4, ip_version: 4;#endifu_int8_t ip_tos;/* 服务质量*/u_int16_t ip_length;/* 长度*/u_int16_t ip_id;/* 标识*/u_int16_t ip_off;/* 偏移*/u_int8_t ip_ttl;/* 生存时间*/u_int8_t ip_protocol;/* 协议类型*/u_int16_t ip_checksum;/* 校验和*/struct in_addr ip_souce_address;/* 源IP地址*/struct in_addr ip_destination_address;/* 目的IP地址*/};struct udp_header{u_int16_t udp_source_port;/* 源端口号*/u_int16_t udp_destination_port;/* 目的端口号*/u_int16_t udp_length;/* 长度*/u_int16_t udp_checksum;/* 校验和*/};struct tcp_header{u_int16_t tcp_source_port;/* 源端口号*/u_int16_t tcp_destination_port;/* 目的端口号*/u_int32_t tcp_sequence_liuzhen;/* 序列号*/u_int32_t tcp_acknowledgement;/* 确认序列号*/#ifdef WORDS_BIGENDIANu_int8_t tcp_offset: 4,/* 偏移*/tcp_reserved: 4;/* 未用*/#elseu_int8_t tcp_reserved: 4,/* 未用*/tcp_offset: 4;/* 偏移*/#endifu_int8_t tcp_flags;/* 标记*/u_int16_t tcp_windows;/* 窗口大小*/u_int16_t tcp_checksum;/* 校验和*/u_int16_t tcp_urgent_pointer;/* 紧急指针*/};struct icmp_header{u_int8_t icmp_type;/* ICMP类型*/u_int8_t icmp_code;/* ICMP代码*/u_int16_t icmp_checksum;/* 校验和*/u_int16_t icmp_id;/* 标识符*/u_int16_t icmp_sequence;/* 序列码*/};void tcp_protocol_packet_callback(u_char *argument, const struct pcap_pkthdr *packet_header, const u_char *packet_content){struct tcp_header *tcp_protocol;/* TCP协议变量*/u_char flags;/* 标记*/int header_length;/* 长度*/u_short source_port;/* 源端口*/u_short destination_port;/* 目的端口*/u_short windows;/* 窗口大小*/u_short urgent_pointer;/* 紧急指针*/u_int sequence;/* 序列号*/u_int acknowledgement;/* 确认号*/u_int16_t checksum;/* 校验和*/tcp_protocol = (struct tcp_header*)(packet_content + 14+20);/* 获得TCP协议内容*/source_port = ntohs(tcp_protocol->tcp_source_port);/* 获得源端口*/destination_port = ntohs(tcp_protocol->tcp_destination_port);/* 获得目的端口*/header_length = tcp_protocol->tcp_offset *4;/* 长度*/sequence = ntohl(tcp_protocol->tcp_sequence_liuzhen);/* 序列码*/acknowledgement = ntohl(tcp_protocol->tcp_acknowledgement);/* 确认序列码*/windows = ntohs(tcp_protocol->tcp_windows);/* 窗口大小*/urgent_pointer = ntohs(tcp_protocol->tcp_urgent_pointer);/* 紧急指针*/flags = tcp_protocol->tcp_flags;/* 标识*/checksum = ntohs(tcp_protocol->tcp_checksum);/* 校验和*/printf("------- TCP协议-------\n");printf("源端口号:%d\n", source_port);printf("目的端口号:%d\n", destination_port);switch (destination_port){case 80:printf("上层协议为HTTP协议\n");break;case 21:printf("上层协议为FTP协议\n");break;case 23:printf("上层协议为TELNET协议\n");break;case 25:printf("上层协议为SMTP协议\n");break;case 110:printf("上层协议POP3协议\n");break;default:break;}printf("序列码:%u\n", sequence);printf("确认号:%u\n", acknowledgement);printf("首部长度:%d\n", header_length);printf("保留:%d\n", tcp_protocol->tcp_reserved);printf("标记:");if (flags &0x08)printf("PSH ");if (flags &0x10)printf("ACK ");if (flags &0x02)printf("SYN ");if (flags &0x20)printf("URG ");if (flags &0x01)printf("FIN ");if (flags &0x04)printf("RST ");printf("\n");printf("窗口大小:%d\n", windows);printf("校验和:%d\n", checksum);printf("紧急指针:%d\n", urgent_pointer);}void ip_protocol_packet_callback(u_char *argument, const struct pcap_pkthdr *packet_header, const u_char *packet_content){struct ip_header *ip_protocol;/* IP协议变量*/u_int header_length;/* 长度*/u_int offset;/* 偏移*/u_char tos;/* 服务质量*/u_int16_t checksum;/* 校验和*/ip_protocol = (struct ip_header*)(packet_content + 14);/* 获得IP协议内容*/checksum = ntohs(ip_protocol->ip_checksum);/* 获得校验和*/header_length = ip_protocol->ip_header_length *4;/* 获得长度*/tos = ip_protocol->ip_tos;/* 获得服务质量*/offset = ntohs(ip_protocol->ip_off);/* 获得偏移*/if (ip_protocol->ip_protocol==6){printf("----------- IP协议-----------\n");printf("版本号:%d\n", ip_protocol->ip_version);printf("首部长度:%d\n", header_length);printf("服务质量:%d\n", tos);printf("总长度:%d\n", ntohs(ip_protocol->ip_length));printf("标识:%d\n", ntohs(ip_protocol->ip_id));printf("偏移:%d\n", (offset &0x1fff) *8);printf("生存时间:%d\n", ip_protocol->ip_ttl);printf("协议类型:%d\n", ip_protocol->ip_protocol);printf("上层协议为TCP协议\n");printf("校验和:%d\n", checksum);printf("源IP地址:%s\n", inet_ntoa(ip_protocol->ip_souce_address));/* 获得源IP地址*/printf("目的IP地址:%s\n", inet_ntoa(ip_protocol->ip_destination_address));/* 获得目的IP地址*/}}void ethernet_protocol_packet_callback(u_char *argument, const struct pcap_pkthdr *packet_header, const u_char *packet_content){static int packet_number = 1;/* 数据包个数,静态变量*/u_short ethernet_type;/* 以太网类型*/struct ether_header *ethernet_protocol;struct ip_header *ip_protocol;/* IP协议变量*/u_int header_length;/* 长度*/u_int offset;/* 偏移*/u_char tos;/* 服务质量*/u_int16_t checksum;/* 校验和*/ip_protocol = (struct ip_header*)(packet_content + 14);/* 获得IP协议内容*/checksum = ntohs(ip_protocol->ip_checksum);/* 获得校验和*/header_length = ip_protocol->ip_header_length *4;/* 获得长度*/tos = ip_protocol->ip_tos;/* 获得服务质量*/offset = ntohs(ip_protocol->ip_off);/* 获得偏移*//* 以太网协议变量*/ethernet_protocol = (struct ether_header*)packet_content;ethernet_type = ntohs(ethernet_protocol->ether_type);/* 获得以太网类型*/if(ethernet_type==0x0800 && ip_protocol->ip_protocol==6){u_char *mac_string;/* 以太网地址*/printf("**************************************************\n");printf("捕获第%d个TCP网络数据包\n", packet_number);printf("捕获时间:\n");printf("%s", ctime((const time_t*) &packet_header->_sec));/* 获得捕获数据包的时间*/printf("数据包长度:\n");printf("%d\n", packet_header->len);printf("-------- 以太网协议--------\n");/* 获得以太网协议内容*/printf("类型:\n");printf("%04x\n", ethernet_type);printf("源以太网地址: \n");mac_string = ethernet_protocol->ether_shost;printf("%02x:%02x:%02x:%02x:%02x:%02x\n", *mac_string, *(mac_string + 1), *(mac_string + 2), *(mac_string + 3), *(mac_string + 4), *(mac_string + 5));/* 获得源以太网地址*/printf("目的以太网地址: \n");mac_string = ethernet_protocol->ether_dhost;printf("%02x:%02x:%02x:%02x:%02x:%02x\n", *mac_string, *(mac_string + 1), *(mac_string + 2), *(mac_string + 3), *(mac_string + 4), *(mac_string + 5));/* 获得目的以太网地址*/ip_protocol_packet_callback(argument, packet_header, packet_content);packet_number++;printf("**************************************************\n");}}void main(){pcap_t *pcap_handle;/* Winpcap句柄*/char error_content[PCAP_ERRBUF_SIZE];/* 存储错误信息*/char *net_interface;/* 网络接口*/struct bpf_program bpf_filter;/* BPF过滤规则*/char bpf_filter_string[] = "";/* 过滤规则字符串*/bpf_u_int32 net_mask;/* 掩码*/bpf_u_int32 net_ip;/* 网路地址*/net_interface = pcap_lookupdev(error_content);/* 获得可用的网络接口*/pcap_lookupnet(net_interface, &net_ip, &net_mask, error_content);/* 获得网络地址和掩码地址*/pcap_handle = pcap_open_live(net_interface, BUFSIZ, 1, 1, error_content);/* 打开网路接口*/pcap_compile(pcap_handle, &bpf_filter, bpf_filter_string, 0, net_ip);/* 编译BPF过滤规则*/pcap_setfilter(pcap_handle, &bpf_filter);/* 设置过滤规则*/if (pcap_datalink(pcap_handle) != DLT_EN10MB)return ;pcap_loop(pcap_handle, - 1, ethernet_protocol_packet_callback, NULL);/* 注册回调函数,循环捕获网络数据包,利用回调函数来处理每个数据包*/ pcap_close(pcap_handle);/* 关闭Winpcap操作*/}七、测试数据本地局域网IP数据包八、测试情况程序运行结果图:结论通过两周的课程设计,增强了我的实际动手能力,通过实际的编程整合串联了我所学到的知识。
一、实验目的: 通过实验了解系统漏洞, 学会发现系统漏洞。
二、实验内容:搭建一个实验环境, 使用namp工具对可能存在漏洞的开放端口进行扫描, 将结果保存在namp.cap文件里。
三、实验原理:缓冲区溢出攻击者必须非常熟悉服务器端运行的程序的特点。
他们必须知道服务器程序会分配多少空间用于接收到来的请求, 并准确知道将要插人的代码写到人何处。
攻击者可以很容易地获得服务器应用程序的代码拷贝, 并对其进行研究和攻击练习。
他们常常是对最流行的服务器软件包的默认设置进行研究, 因为大部分计算机都是在这些设置下运行的。
通常编写的恶意代码都会向其他有漏洞的主机进行打一散。
例如, 利用缓冲区溢出漏洞进人系统的恶意代码会对其他主机执行同样的攻击。
恶意代码也可能在计算机上搜索电子邮件地址, 并且把它自己的拷贝作为电子邮件的附件发送出去。
在本实验中, 我们将对一个用于探测网络中另一个系统的开放端口或漏洞的网络应用程序的跟踪结果进行观察分析。
我们也将对一个感染了冲击波蠕虫病毒的计算机的跟踪结果进行分析。
我们会看到它是如何通过试图在Windows分布式组件对象模型(DCOM)和远程过程调用(RPC)接口中发掘漏洞来传播自己的。
四、实验器材、环境配置操作及实验数据的产生:本实验的跟踪记录可在两个配置中捕获。
在第一个配置图中, 一个在防火墙后运行DHCP的PC机, 用于扫描防火墙下开放的端口。
在第二个配置图中, 我们在校园网环境中选择了一台感染冲击波蠕虫病毒的PC机进行网络行为跟踪。
配置图一配置图二在第一个实验中, 我们使用nmap工具来对另一台主机192.168.0.1的开放端口或可能的漏洞进行扫描。
我们识别到一个开放端口, HTTP端口, 将跟踪结果保存在nmap.cap文件中。
像nmap这样的端口扫描程序通过向许多常用端口发送SYN分组以检测开放端口(或漏洞)。
在本例中, SYN分组一共发送给了1658个端口。
如果服务器软件在这些端口上监听, 它就会返回一个SYNACK分组作为回应。
西安郵電大學网络协议分析与仿真课程设计报告书院系名称:计算机学院实验:网络流量分析内容学生:姓名专业:网络工程名称班:级学号:时间:2012年12月15日网络协议分析与仿真课程设计报告网络流量分析一、课程设计目的加深对IP、DSN 、TCP、UDP、HTTP等协议的理解;掌握流量分析工具的使用,学习基本的流量分析方法。
二、课程设计内容流量分析工具:Wireshark(Windows或Linux),tcpdump(Linux)要求:使用过滤器捕获特定分组;用脚本分析大量流量数据(建议用perl)。
内容:Web流量分析清除本机DNS缓存,访问某一网站主页,捕获访问过程中的所有分组,分析并回答下列问题(以下除1、3、8、11外,要求配合截图回答):(1)简述访问web页面的过程。
(2)找出DNS解析请求、应答相关分组,传输层使用了何种协议,端口号是多少?所请求域名的IP地址是什么?(3)统计访问该页面共有多少请求IP分组,多少响应IP分组?(提示:用脚本编程实现)(4)找到TCP连接建立的三次握手过程,并结合数据,绘出TCP 连接建立的完整过程,注明每个TCP报文段的序号、确认号、以及SYN\ACK的设置。
(5)针对(4)中的TCP连接,该TCP连接的四元组是什么?双方协商的起始序号是什么?TCP连接建立的过程中,第三次握手是否带有数据?是否消耗了一个序号?(6)找到TCP连接的释放过程,绘出TCP连接释放的完整过程,注明每个TCP报文段的序号、确认号、以及FIN\ACK的设置。
(7)针对(6)中的TCP连接释放,请问释放请求由服务器还是客户发起?FIN报文段是否携带数据,是否消耗一个序号?FIN报文段的序号是什么?为什么是这个值?(8)在该TCP连接的数据传输过程中,找出每一个ACK报文段与相应数据报文段的对应关系,计算这些数据报文段的往返时延RTT(即RTT样本值)。
根据课本200页5.6.2节内容,给每一个数据报文段估算超时时间RTO。
计算机科学与技术学院课程设计成绩单优秀:90分~100分良好:80 分~89分中等:70~79分及格:60~69分不及格0分~59分武汉科技大学计算机科学与技术学院制表计算机科学与技术学院课程设计报告课程名称:网络编程与协议分析专班学姓业:级:号:名:指导老师:《网络编程与协议分析》课程设计报告一、课设题目:网络数据包抓取与分析软件二、课设要求:1)能抓取本地主机所在局域网子网内的所有数据包2)分析并显示所抓取数据包的IP 头部各字段的信息3)分析并显示所抓取数据包的封装在IP 数据包内的协议头部字段信息(TCP、UDP、ICMP 等)4)生成日志信息,以文本文档形式保存5)分析并显示所抓取数据包应用层协议头部字段信息(HTTP、FTP、DNS、Telnet、SMTP、POP等各种应用层协议中至少取三种)三、用到的基本概念及原理(3)Winpcap的组成和结构(4)Winpcap基本原理(5)NPF 在windows 系统中的位置(6)系统构架四、部分代码1)初始化套接字BOOL CTestDlg::SockInit(){WSADATA wsa;if(WSAStartup(MAKEWORD(2,2),&wsa)!=0){AfxMessageBox("WSAStartup fail!");}m_sock=socket(AF_INET,SOCK_RAW,0);if(m_sock==INVALID_SOCKET){AfxMessageBox("socket fail!");}SOCKADDR_IN addr;addr.sin_family=AF_INET;addr.sin_port=htons(5000);struct hostent FAR *pHostent;char FAR name[25];gethostname(name,25);pHostent = gethostbyname(name);memcpy(&addr.sin_addr.S_un.S_addr,pHostent->h_addr_list[0],pHostent->h_len);if(bind(m_sock,(SOCKADDR*)&addr,sizeof(addr))!=0){AfxMessageBox("bind fail!");}DWORD dwBytesRet;unsigned int optval = 1;int pCount=0;if(INVALID_SOCKET==(WSAIoctl(m_sock,SIO_RCVALL,&optval,sizeof(optval),NULL,0,&dwBytesRet,NULL, NULL))){AfxMessageBox("WSAIoctl Fail!");return false;}return true;}2)初始化表格BOOL CTestDlg::ListInit(){DWORD dwStyle= GetWindowLong(m_List.m_hWnd, GWL_STYLE);SetWindowLong(m_List.m_hWnd,GWL_STYLE,dwStyle|LVS_REPO);DWORD dwStyles= m_List.GetExStyle();dwStyles&=~LVS_EX_CHECKBOXES;m_List.SetExtendedStyle(dwStyles|LVS_EX_FULLROWSELECT|LVXGRIDLINES);m_List.InsertColumn(1,"版本",LVCFMT_CENTER,40,0);m_List.InsertColumn(2,"头部长度",LVCFMT_CENTER,60,1);m_List.InsertColumn(3,"服务类型",LVCFMT_CENTER,60,2);m_List.InsertColumn(4,"总长度",LVCFMT_CENTER,50,3);m_List.InsertColumn(5,"标识符",LVCFMT_CENTER,50,4);m_List.InsertColumn(6,"标志位",LVCFMT_CENTER,50,5);m_List.InsertColumn(7,"片偏移",LVCFMT_CENTER,50,6);m_List.InsertColumn(8,"生存周期",LVCFMT_CENTER,60,7);m_List.InsertColumn(9,"协议",LVCFMT_CENTER,40,8);m_List.InsertColumn(10,"首部校验和",LVCFMT_CENTER,80,9);m_List.InsertColumn(11,"源地址",LVCFMT_CENTER,100,10);m_List.InsertColumn(12,"目的IP地址",LVCFMT_CENTER,100,11);return true;}3)ip,tcp,udp,icmp头部定义struct iphead{unsigned char ip_EdiAndLen;//版本&首部长度unsigned char ip_Serve; //服务类型unsigned short int ip_Len; //总长度unsigned short int ip_Sign; //标识unsigned short int ip_MarkAndMove;//标识&片偏移unsigned char ip_Ttl; //生存时间unsigned char ip_Protocol; //上层协议unsigned short int ip_Sum;//首部校验和unsigned int ip_SoIp; //源ipunsigned int ip_DeIp; //目的ip};struct tcphead{unsigned short tcp_SoPort; //16 位的源端口unsigned short tcp_DePort; //16 位的目的端口unsigned int tcp_Seq; //32 位的序列号unsigned int tcp_Ack; //32 位的确认号unsigned char tcp_LenAndRes;//4位的首部长度和4位的保留字unsigned char tcp_Flag; //2位的保留字和6 位的标志位unsigned short tcp_Win; //16 位的窗口大小unsigned short tcp_Wum;//16 位校验和unsigned short tcp_Mov; //16 位的紧急数据偏移量};struct udphead{unsigned short udp_SoPort; //源端口unsigned short udp_DePort; //目的端口unsigned short udp_Len; //总长度unsigned short udp_Sum; //校验和};struct icmphead{unsigned char icmp_Type;//类型unsigned char icmp_Code;//代码unsigned short icmp_Sum;//16 位检验和};4)“开始”按钮事件void CTestDlg::OnStart(){//TODO:Add your control notification handler code hereDWORD code;if(!GetExitCodeThread(m_thr,&code)|| (code!= STILL_ACTIVE)){alldata*recvdata=new alldata;recvdata->lis=&m_List;recvdata->sock=m_sock;m_thr=CreateThread(NULL,0,RecvProc,(LPVOID)recvdata,0,NULL);CloseHandle(m_thr);}else{m_List.DeleteAllItems();ResumeThread(m_thr);}GetDlgItem(IDC_STOP)->EnableWindow(TRUE);GetDlgItem(IDC_START)->EnableWindow(FALSE);GetDlgItem(IDC_STOP)->SetFocus();}5)数据包抓取与初步处理DWORD WINAPI CTestDlg::RecvProc(LPVOID lpParameter){SOCKET sock=((alldata*)lpParameter)->sock;CListCtrl*lis=(CListCtrl*)(((alldata*)lpParameter)->lis);struct iphead*ih;SOCKADDR_IN tem;char RecvBuf[65535]={0};char soip[16];char deip[16];char buf[100];int i=0;while(1){if(int a=recv(sock,ddat[++count].buff,sizeof(ddat[count].buff),0)<=0) continue;ih=(struct iphead*)(ddat[count].buff);tem.sin_addr.s_addr=ih->ip_SoIp;strncpy(soip,inet_ntoa(tem.sin_addr),16);tem.sin_addr.s_addr=ih->ip_DeIp;strncpy(deip,inet_ntoa(tem.sin_addr),16);lis->InsertItem(i, "fdgfg");sprintf(buf,"%d",ih->ip_EdiAndLen>>4);lis->SetItemText(i,0,buf);sprintf(buf,"%d",ih->ip_EdiAndLen&0xf);lis->SetItemText(i,1,buf);sprintf(buf,"%d",ih->ip_Serve);lis->SetItemText(i,2,buf);sprintf(buf,"%d",ih->ip_Len);lis->SetItemText(i,3,buf);sprintf(buf,"%d",ih->ip_Sign);lis->SetItemText(i,4,buf);sprintf(buf,"%d",ih->ip_MarkAndMove>>13);lis->SetItemText(i,5,buf);sprintf(buf,"%d",ih->ip_MarkAndMove&0x1fff);lis->SetItemText(i,6,buf);sprintf(buf,"%d",ih->ip_Ttl);lis->SetItemText(i,7,buf);switch((int)ih->ip_Protocol){case1:sprintf(buf,"%s","ICMP");break;case2:sprintf(buf,"%s","IGMP");break;case6:sprintf(buf,"%s","TCP");break;case8:sprintf(buf,"%s","EGP");break;case9:sprintf(buf,"%s","IGP");break;case17:sprintf(buf,"%s","UDP");break;case41:sprintf(buf,"%s","IPv6");break;case89:sprintf(buf,"%s","OSPF");break;default:sprintf(buf,"%s","Error");}lis->SetItemText(i,8,buf);sprintf(buf,"%d",ih->ip_Sum);lis->SetItemText(i,9,buf);sprintf(buf,"%s",soip);lis->SetItemText(i,10,buf);sprintf(buf,"%s",deip);lis->SetItemText(i,11,buf);i++;Sleep(100);}return true;}6)表格单击事件void CTestDlg::OnClickList1(NMHDR* pNMHDR,LRESULT*pResult) {//TODO:Add your control notification handler code hereNM_LISTVIEW*pNMListView = (NM_LISTVIEW*)pNMHDR;CString buf;char tem[100];int i;if(pNMListView->iItem!= -1){i=pNMListView->iItem;CString strtemp;CNewDlg newdlg;iphead*iph=(iphead *)(ddat[i].buff);ttttttttt=*((tcphead*)(ddat[i].buff+(iph->ip_EdiAndLen&0xf)*4)); uuuuuuuuu=*((udphead*)(ddat[i].buff+(iph->ip_EdiAndLen&0xf)*4)); icmphead ih=*((icmphead*)(ddat[i].buff+(iph->ip_EdiAndLen&0xf)*4));switch((int)iph->ip_Protocol){case6:sprintf(tem,"源端口:%d\r\n",th.tcp_SoPort);buf+=tem;sprintf(tem,"目的端口:%d\r\n",th.tcp_DePort);buf+=tem;sprintf(tem,"序列号:%d\r\n",th.tcp_Seq);buf+=tem;sprintf(tem,"确认号:%d\r\n",th.tcp_Ack);buf+=tem;sprintf(tem,"数据偏移:%d\r\n",th.tcp_LenAndRes>>4);buf+=tem;sprintf(tem,"保留:%d\r\n",th.tcp_LenAndRes&0xf);buf+=tem;sprintf(tem,"标志:%d\r\n",th.tcp_Flag&0x3f);buf+=tem;sprintf(tem,"窗口:%d\r\n",th.tcp_Win);buf+=tem;sprintf(tem,"校验和:%d\r\n",th.tcp_Wum);buf+=tem;sprintf(tem,"紧急指针:%d\r\n",th.tcp_Mov);buf+=tem;newdlg.m_data=buf;break;case17:sprintf(tem,"源端口:%d\r\r\n",uh.udp_SoPort);buf+=tem;sprintf(tem,"目的端口:%d\r\n",uh.udp_DePort);buf+=tem;sprintf(tem,"长度:%d\r\n",uh.udp_Len);buf+=tem;sprintf(tem,"校验和:%d\r\n",uh.udp_Sum);buf+=tem;newdlg.m_data=buf;break;case1:sprintf(tem,"类型:%d\r\n",ih.icmp_Type);buf+=tem;sprintf(tem,"代码:%d\r\n",ih.icmp_Code);buf+=tem;sprintf(tem,"校验和:%d\r\n",ih.icmp_Sum);buf+=tem;newdlg.m_data=buf;break;default:AfxMessageBox("No Data!");newdlg.m_data="";}newdlg.DoModal();}*pResult = 0;}7)“停止”按钮事件void CTestDlg::OnStop(){//TODO:Add your control notification handler code hereSuspendThread(m_thr);DWORD code;CString strDate;CString strBuf;int index=m_List.GetItemCount();int i,j=0;GetExitCodeThread(m_thr,&code);if(code!= STILL_ACTIVE){AfxMessageBox("程序初始化失败!\n 请检查配置后重新运行!"); } else{CTime ttime =CTime::GetCurrentTime();strDate.Format("%d-%d-%d-",ttime.GetYear(),ttime.GetMonth(),ttime.GeDay());strDate+=ttime.Format("%H-%M-%S");ofstream outfile("history\\"+strDate + ".log");outfile<<setw(6)<<"版本"<<setw(10)<<"头部长度"<<setw(10)<<"服务类型"<<setw(8)<<"总长度"<<setw(8)<<"标识符"<<setw(8)<<"标志位"<<setw(8)<<"片偏移"<<setw(10)<<"生存周期"<<setw(6)<<"协议"<<setw(12)<<"首部校验和"<<setw(20)<<"源地址"<<setw(20)<<"目的IP地址"<<endl;while(j < index){for (i= 0;i < 12;i++){strBuf=m_List.GetItemText(j,i);switch(i){case0:outfile<<setw(6)<<strBuf;break;case1:outfile<<setw(10)<<strBuf;break;case2:outfile<<setw(10)<<strBuf;break;case3:outfile<<setw(8)<<strBuf;break;case4:outfile<<setw(8)<<strBuf;break;case5:outfile<<setw(8)<<strBuf;break;case6:outfile<<setw(8)<<strBuf;break;case7:outfile<<setw(10)<<strBuf;break;case8:outfile<<setw(6)<<strBuf;break;case9:outfile<<setw(12)<<strBuf;break;case10:outfile<<setw(20)<<strBuf;break;case11:outfile<<setw(20)<<strBuf;outfile<<endl;j++;break;}}}outfile.close();AfxMessageBox("数据已写入日志文件!");}GetDlgItem(IDC_STOP)->EnableWindow(FALSE);GetDlgItem(IDC_START)->EnableWindow(TRUE);GetDlgItem(IDC_START)->SetFocus();}五、程序截图“开始”“停止”TCPUDPICMP六、实验总结通过这次实验我学会了怎么自我去学习,从刚开始的无从下手到慢慢的自我完善。