编程实现简单的TCP协议分析器
codesys tcpserver例程

codesys tcpserver例程CODESYS是一个流行的工业自动化编程环境,用于PLC(可编程逻辑控制器)和其他嵌入式系统。
在CODESYS中实现TCP服务器功能通常涉及使用CODESYS的内置库来处理网络通信。
以下是一个基本的TCP服务器例程的概念性概述,该例程将超出500字的要求,以提供详细的实现指导。
首先,你需要在CODESYS项目中包含适当的网络库。
这通常是通过在项目设置中启用相关的库功能来完成的。
接下来,创建一个新的POU(程序组织单元),例如一个函数块或方法,用于处理TCP 服务器的逻辑。
在这个POU中,你将需要定义一些变量来存储服务器的状态信息,如当前连接状态、客户端地址和端口等。
初始化服务器:使用CODESYS网络库中的功能块或函数来初始化TCP服务器。
设置服务器监听的端口号和其他相关参数。
启动服务器:调用适当的函数来启动TCP服务器,使其开始监听传入的连接请求。
接受客户端连接:在服务器启动后,它将等待客户端的连接请求。
当请求到达时,使用网络库中的功能来接受连接,并获取客户端的信息。
数据交换:一旦连接建立,服务器和客户端就可以开始交换数据。
你可以使用网络库中的发送和接收函数来处理数据传输。
处理数据:根据应用程序的需求,服务器可能需要解析从客户端接收到的数据,并执行相应的逻辑处理。
关闭连接:当数据交换完成或连接不再需要时,使用网络库的功能来关闭与客户端的连接。
服务器停止:如果需要停止服务器,调用适当的函数来关闭服务器并释放相关资源。
在编写TCP服务器例程时,还需要考虑错误处理和异常情况,以确保网络的稳定性和可靠性。
此外,根据项目的具体需求,可能还需要实现额外的功能,如客户端管理、数据加密或身份验证等。
请注意,以上只是一个概念性的概述,具体的实现细节将取决于你使用的CODESYS版本和具体的硬件平台。
建议查阅CODESYS的官方文档和相关的网络库文档,以获取更详细的指导和示例代码。
网络安全协议分析实验3_TCP_SYN扫描_协议分析TCP_ACK扫描_协议分析

《网络安全协议分析与应用》实验报告实验序号: 3 实验项目名称:一次简单扫描_全面扫描_协议分析TCP_SYN扫描_协议分析TCP_ACK扫描_协议分析学号姓名专业班级20网络工程实验地点指导教师实验时间2023-4-7 一、一次简单扫描_全面扫描_协议分析【【实验目的】1)了解Nmap扫描的基本使用方式2)了解简单扫描与全面扫描的区别3)了解简单扫描与全面扫描的协议【实验原理】1)使用不同的命令方式分别进行一次简单扫描与全面扫描,了解Nmap的基础使用方式。
在一次简单扫描中,Nmap会以默认TCP SYN扫描方式进行,仅判断目标端口是否开放,若开放,则列出端口对应的服务名称。
在一次完全扫描过程中,Nmap不仅仅确认了开放端口,一旦发现某个端口开放,Nmap会以其对应的协议通信方式去更加深入的验证该项服务涉及到的版本信息、账户信息等更为详细的结果2)查看目标主机状态【【实验环境】目标机:192.168.1.3工具: 桌面【【实验步骤】一、一次简单扫描及协议分析1.1打开wireshark进行抓包,在cmd命令行下输入命令“nmap 192.168.1.3”对目标主机进行一次简单扫描。
如图1所示图11.2可以看到目标主机有许多tcp端口处于开放状态,SERVICE一栏显示了各端口对应的服务。
切换到wireshark,在过滤器中输入:ip.addr == 192.168.1.3,确定。
如图2所示图21.3通过wireshark抓包可以看到一次简单扫描为TCP SYN扫描方式,我们针对其对目标机445端口的扫描进行分析(其余端口请自行分析)。
Nmap由本地端口46062向目标机的445端口发送TCP SYN数据包请求连接。
如图3所示图31.4目标机接收到来自扫描机的TCP请求之后向其46062端口发送SYN,ACK确认包。
如图4所示图41.5扫描机向目标机发送RST数据包进行连接复位,目标机清除445连接。
TCP/IP协议分析及通信应用编程

维普资讯
计 算 机 与 现 代 化
2O O6年第 3 期 文章编号 :0627 (060 -070 10-45 20 )303-3 J U J Y ⅪA D JIA l S l U N A}U 总第 17期 2
T PI C /P协议分析及通信应 Nhomakorabea编程 DIB o
( j i nt t o 址 Fr ni en n esy Snun7 30 ,Cia M  ̄l ste f eI i u o eE g er gU i rt, aya 180 h ) c n i v i n
 ̄ : hst脯i n l T l I ¥a ay tess m o s ut n o oio n nt no T P I rtcl n el a o eI r锄 o tr l  ̄ h t cnt c o 。cmp sina df c o f C /Pp oo ,adrai t n瑚I I I ye r i t u i o zi cai fne- i
收稿 日期 -050 .5 ' 0.51 2 作者简介 : 狄博 (97)男 , 17. , 陕西三 原人 , 空军工程大学导弹学 院博士研究生 , 研究 方向 : 智能决策支持 系统 。
维普资讯
3 8
计
算 机
与
现 代
化
20 第 3 06年 期
使用libnet与libpcap构造TCPIP协议软件

概述 目前有许多不同的成熟的 TCP/IP 协议的实现版本,其中大部分都在操作系统的核心 实现, 这种方案固然是提高 TCP/IP 协议软件的效率的必然所选, 但却给 TCP/IP 协议的学 习、研究和调试带来了很大的困难。
于是,如果不考虑 TCP/IP 协议软件实现的效率问题, 在应用进程中实现一个 TCP/IP 协议软件,是具有一定的意义和价值的。
本文作者构造了一个单进程的 TCP/IP 协议软件:minitcpip,并提供了一个 SOCKE T 接口函数库: minisocket。
在实现这个协议软件函数库时,作者选择采用了 libnet+li bpcap 的方式在用户态下实现这个软件,不仅是因为这样可以避开一些操作系统对底层网 络开发的种种限制带来的不便,将精力集中在对协议软件本身的理解上;另外一个原因,则 是为大家学习和综合使用 libnet 和 libpcap 提供一个范例。
下文首先介绍了 libnet 和 libpcap 函数库及其使用,并给出了一个利用其实现 ARP 协议的例程--该协议的实现也包括在 minitcpip 软件之中, 然后给出了本文的协议软件和 S OCKET 函数库实现的方案,并围绕本文主题,对涉及到的一些关键技术问题进行了分析, 最后,对这种实现方法做了一个简单的总结,指出了这种实现方法的一些局限。
何谓 libnet、libpcap 目前众多的网络安全程序、 工具和软件都是基于 socket 设计和开发的。
由于在安全程 序中通常需要对网络通讯的细节(如连接双方地址/端口、服务类型、传输控制等)进行检查、 处理或控制,象数据包截获、数据包头分析、数据包重写、甚至截断连接等,都几乎在每个 网络安全程序中必须实现。
为了简化网络安全程序的编写过程, 提高网络安全程序的性能和 健壮性,同时使代码更易重用与移植,最好的方法就是将最常用和最繁复的过程函数,如监 听套接口的打开/关闭、数据包截获、数据包构造/发送/接收等,封装起来,以 API librar y 的方式提供给开发人员使用。
tcp协议实验报告

tcp协议实验报告TCP协议实验报告一、引言在计算机网络中,TCP(Transmission Control Protocol)是一种常用的传输层协议,负责实现可靠的数据传输。
本实验旨在通过对TCP协议的实验研究,深入理解其工作原理和性能特点。
二、实验目的1. 理解TCP协议的基本原理和机制。
2. 掌握TCP协议的连接建立、数据传输和连接释放过程。
3. 了解TCP协议的流量控制和拥塞控制机制。
三、实验环境1. 操作系统:Windows 102. 实验工具:Wireshark、Python四、实验过程1. 连接建立在实验中,我们使用Python编写了一个简单的TCP服务器和客户端程序。
首先,客户端向服务器发起连接请求(SYN包),服务器接收到请求后发送确认包(SYN+ACK包),最后客户端发送确认包(ACK包)完成连接建立过程。
2. 数据传输在连接建立后,我们通过客户端向服务器发送数据,观察数据在网络中的传输情况。
Wireshark工具可以捕获和分析网络数据包,我们可以通过它来查看TCP 数据包的详细信息,包括源地址、目的地址、序列号、确认号等。
3. 连接释放当数据传输完成后,我们需要关闭TCP连接。
在实验中,我们模拟了正常关闭连接和异常关闭连接两种情况。
正常关闭连接时,客户端和服务器分别发送FIN包和ACK包,最后双方都发送FIN包完成连接释放。
异常关闭连接时,我们可以通过强制关闭客户端或服务器进程来模拟,观察TCP协议对连接异常关闭的处理过程。
五、实验结果通过实验,我们观察到TCP协议的一些重要特点和性能表现:1. 可靠性:TCP协议通过序列号和确认号机制,确保数据的可靠传输。
如果接收方收到的数据包乱序或丢失,TCP协议会要求发送方重新发送。
2. 流量控制:TCP协议通过滑动窗口机制实现流量控制,防止发送方发送速度过快导致接收方无法处理。
当接收方缓冲区已满时,会发送窗口为0的ACK包,告知发送方暂停发送。
实验四 TCPUDP协议分析

实验四TCP/UDP协议分析【实验目的】1、理解与掌握TCP协议2、UDP协议通信机制【预习要求】1、复习课堂上所学习的TCP协议、UDP协议方面基本知识。
【工具软件】协议解码工具:wireshark(或sniffer pro)【实验原理】(一)TCP说明:(1)每个TCP段都包括源端和目的端的端口号,用于寻找发送端和接收端的应用进程。
这两个值加上IP首部的源端IP地址和目的端IP地址唯一确定一个TCP连接。
(2)序号用来标识从TCP发送端向接收端发送的数据字节流,它表示在这个报文段中的第一个数据字节。
如果将字节流看作在两个应用程序间的单向流动,则TCP用序号对每个字节进行计数。
(3)当建立一个新连接时,SYN标志变1。
序号字段包含由这个主机选择的该连接的初始序号ISN,该主机要发送数据的第一个字节的序号为这个ISN加1,因为SYN标志使用了一个序号。
(4)既然每个被传输的字节都被计数,确认序号包含发送确认的一端所期望收到的下一个序号。
因此,确认序号应当时上次已成功收到数据字节序号加1。
只有ACK标志为1时确认序号字段才有效。
(5)发送ACK无需任何代价,因为32位的确认序号字段和ACK标志一样,总是TCP 首部的一部分。
因此一旦一个连接建立起来,这个字段总是被设置,ACK标志也总是被设置为1。
(6)TCP为应用层提供全双工的服务。
因此,连接的每一端必须保持每个方向上的传输数据序号。
(7)TCP可以表述为一个没有选择确认或否认的华东窗口协议。
因此TCP首部中的确认序号表示发送方已成功收到字节,但还不包含确认序号所指的字节。
当前还无法对数据流中选定的部分进行确认。
(8)首部长度需要设置,因为任选字段的长度是可变的。
TCP首部最多60个字节。
(9)6个标志位中的多个可同时设置为1◆URG-紧急指针有效◆ACK-确认序号有效◆PSH-接收方应尽快将这个报文段交给应用层◆RST-重建连接◆SYN-同步序号用来发起一个连接◆FIN-发送端完成发送任务(10)TCP的流量控制由连接的每一端通过声明的窗口大小来提供。
基于TCP协议的简单即时通信软件的设计与实现(含源文件)

基于TCP协议的网络通信系统的设计与实现摘要:网络通信,由于其具有实时性、跨平台性、成本低、效率高等优点而受到广泛的使用.设计并实现一个能够处理多用户进行实时、安全的即时通信系统具有较强的现实意义。
即时通信的底层通信是通过SOCKET套接字接口实现的。
当前的主流UNIX系统和微软的WINDOWS系统都在内核提供了对SOCKET字接口的支持。
使用这个统一的接口,可以编写一个可移植的TCP/IP通信程序。
使信息能够在INTERNET上可靠的传输。
本文设计并实现了基于局域网内的简单即时通信系统,系统采用C/S模式,底层通信通过SOCKET套接字接口实现,服务器负责客户端的登录验证,好友信息的保存和心跳报文的发送.客户端采用P2P方式实现消息传递,并能实现文件的传输。
本文首先讨论了同步套接字,异步套接字,多线程并发执行任务等;然后阐述了客户端、服务器如何使用XML序列化的消息进行通信。
关键词:即时通信;文件传输;套接字;TCP协议Abstract :Instant messages have several advantages such as real-time, cross-platform, cheap a nd efficient. To design a Multi-user IM (instant message) architecture is very importan t in both theory and realism。
Instant message based on TCP/IP protocol that is realiz ed by socket interface。
Almost all UNIX operation systems and Microsoft's window s operation systems provide support of socket in the kernel. Using the uniform interfa ce, we can develop a portable program of TCP/IP, which help us transfer informatio n in Internet safely and credibly。
tcp网络编程课程设计

tcp网络编程课程设计一、课程目标知识目标:1. 让学生理解TCP协议的基本原理,掌握TCP网络编程的基本概念和技术要点。
2. 使学生掌握套接字编程的基本方法,能够运用所学知识构建简单的TCP客户端和服务器端程序。
3. 帮助学生了解网络编程中的异常处理和资源管理,培养良好的编程习惯。
技能目标:1. 培养学生运用所学知识解决实际问题的能力,能够独立设计和实现简单的TCP网络应用程序。
2. 提高学生的编程实践能力,使其在编程过程中熟练运用调试工具,排查并解决常见问题。
3. 培养学生团队协作能力,能够与他人共同分析和讨论网络编程问题,共同完成项目任务。
情感态度价值观目标:1. 激发学生对计算机网络编程的兴趣,培养其主动探索和学习的积极性。
2. 培养学生严谨、认真、负责的学术态度,使其在网络编程过程中遵循相关规范和道德准则。
3. 增强学生的网络安全意识,使其在编程过程中注重保护用户隐私和数据安全。
课程性质:本课程为实践性较强的学科,注重培养学生的动手能力和实际应用能力。
学生特点:学生已具备一定的编程基础和网络知识,具有较强的学习能力和探究精神。
教学要求:教师需结合实际案例,引导学生掌握TCP网络编程的基本原理和技能,注重培养学生的实践能力和团队协作能力。
在教学过程中,关注学生的个体差异,因材施教,确保每位学生都能达到课程目标。
通过课后作业、项目实践和课堂讨论等多种形式,评估学生的学习成果。
二、教学内容1. TCP协议基本原理:讲解TCP协议的特点、三次握手和四次挥手过程,引导学生理解可靠传输和流量控制的重要性。
教材章节:第一章TCP/IP协议基础2. 套接字编程:介绍套接字的概念、类型和编程接口,教授如何使用套接字进行客户端和服务器端通信。
教材章节:第二章套接字编程基础3. 简单的TCP客户端和服务器端程序设计:讲解如何构建TCP客户端和服务器端程序,分析常见的编程模型和代码结构。
教材章节:第三章TCP网络编程实例4. 异常处理与资源管理:教授在网络编程过程中如何进行异常处理和资源管理,提高程序的稳定性和可靠性。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《网络系统》课程设计报告学院专业班级学号学生姓名指导教师课程成绩完成日期2013年6月28日课程设计成绩评定学院专业班级学号学生姓名指导教师完成日期2013年6月28日指导教师对学生在课程设计中的评价指导教师对课程设计的评定意见课程设计任务书学院专业编程实现简单的TCP协议分析器学生姓名:指导老师:摘要编程实现简单的TCP协议分析器。
TCP协议分析器是一种用于监督和跟踪网络活动的诊断工具。
它从局域网中抓取IP数据包,并对它进行分析得到相对应的头部信息,过滤TCP包进行分析,得到TCP包的相应信息。
运行程序平台为windows7/XP,程序通过调试运行,初步实现了设计目标,并且再经过适当完善后,将可以应用在商业中解决实际问题。
TCP协议的数据传送程序是由二个子程序组成的。
也可以看成是服务器端程序和客户端程序,其中:服务器端程序的功能是侦听端口号,接收远程主要的TCP连接申请,并接收远程主机传送来的文字数据。
关键词程序设计;TCP;局域网;指令;服务器目录1 引言.......................................................................................... 错误!未定义书签。
1.1问题描述........................................................................... 错误!未定义书签。
1.2基本要求........................................................................... 错误!未定义书签。
2系统设计 (1)2.1 设计思想 (1)2.2系统结构 (2)3程序流程 (2)3.1 程序流程图 (2)4 模块设计介绍 (4)4.1 主模块 (4)5 判断 (5)5.1判断IP协议类型字段 (5)5.2判断以太网字协议段类型 (12)6 系统调试 (13)6.1测试情况 (13)7 结束语........................................................................................ 错误!未定义书签。
附录:源程序代码 (16)1 引言TCP协议的数据传送程序是由二个子程序组成的。
也可以看成是服务器端程序和客户端程序,其中:服务器端程序的功能是侦听端口号,接收远程主要的TCP连接申请,并接收远程主机传送来的文字数据。
另外一个子程序,也就是所谓的客户端程序,主要实现向网络的远程主机提出TCP连接申请。
1.1问题描述编程实现简单的TCP协议分析器,TCP协议分析器是一种用于监督和跟踪网络活动的诊断工具,它从局域网中抓取IP数据包,并对它进行分析得到相应的头部信息,过滤TCP包进行分析,得到TCP包的相应信息。
1.2基本要求1.利用原始套接字实现简单的TCP协议分析器。
2.系统功能包括:2.1 原始套接字与网卡绑定,并接收流经网卡的所有数据包;2.2 对数据包进行分析以获得源IP地址和目的IP地址;2.3 对TCP Segment进行分析以获得其首部详细信息;2.4 显示分析结果。
3 使用VC++。
2 系统设计2.1设计思想TCP协议的数据传送程序是由二个子程序组成的,也可以看成是服务器端程序和客户端程序。
其中,服务器端程序的功能是侦听端口号,接收远程主要的TCP连接申请,并接收远程主机传送来的文字数据。
另外一个子程序,也就是所谓的客户端程序,主要实现向网络的远程主机提出TCP连接申请。
程序利用原始套接字抓取局域网中的IP包。
Raw Socket: 原始套接字可以用它来发送和接收IP 层以上的原始数据包, 如ICMP,TCP, UDP等。
TCP协议分析器实现了sniffer的一部分功能。
而sniffer的工作原理是:1. 把网卡置于混杂模式;2. 捕获数据包;3. 分析数据包。
2.2系统结构(1)Pcap_addr描述网络接口地址;(2)pcap_pkthdr用来描述每个捕获到的数据包的基本信息;(3)int_pcaplookupnet获取网络地址和网络掩码;(4)int_pcaploop循环捕获网络数据包,直到遇到错误或满足退出条件;(5)pcap_t* pcap_open_dead构造一个libpcap句柄。
3程序流程3.1程序流程如图1图1数据包的分析流程4 模块设计介绍4.1主模块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操作*/}5 判断5. 1判断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;t;/* 目的端口号*/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");}}5.2 判断以太网字段类型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地址*/};6 系统调试6.1测试情况捕获数据包如图2图2捕获数据包的测试结果判断IP协议类型字段如图3图3判断IP协议类型字段的测试结果判断以太网类型字段如图4图4判断以太网类型字段的测试结果7 结束语通过这两周的课程设计,它增强了我的实际动手能力,让我更加意识到不懂就问的乐趣,问可以是问老师、学长、学姐及度娘。