发送Ethernet+ARP数据包

合集下载

精简版实验四:Ethereal Lab — Ethernet and ARP

精简版实验四:Ethereal  Lab — Ethernet and ARP

实验四:Ethereal Lab —Ethernet and ARP一、实验目的(1)研究Ethernet的帧格式(2)ARP协议的请求应答机制(3)ARP缓存的管理二、实验原理以太网技术在当前局域网领域占据主流的地位,是最近三十年来最成功的网络技术之一。

不同格式的以太网帧各字段定义各不相同,彼此也不兼容。

Ethernet II以太网标准帧格式是以太网的事实标准,其各字段的定义如下图.ARP协议是一种用于将各种协议地址解析为物理地址的协议. ARP报文分为两种,一种为ARP请求报文,另一种是ARP响应报文.为了提高ARP的效率,在主机内开辟一块内存,存放最近获得的IP地址到以太网地址的映射.主机在发送IP 报文时,首先检查缓存,若找不到匹配的映射,再利用ARP请求地址解析.三、实验步骤与实验问题探讨【注:实验步骤应用(x),问题用[x]】1. 捕获并分析Ethernet帧执行下列操作以捕获一组以太网帧进行研究:(1)首先确保你的浏览器缓存为空(对于Internet Explorer,选Tools->Internet Options->Delete Files)(2)启动Ethereal分组嗅探器(3)输入下列URL到浏览器:/ethereal-labs/ HTTP-ethereal-lab-file3.html,浏览器将显示相当长的美国的权利法案.(4)停止Ethereal分组捕获。

首先,找到从你主机发往 的HTTP GET报文的分组序号和从发向你主机的HTTP响应报文开始的分组序号(在Ethereal上部窗口的最左列),你可以看到一个类似于下图的屏幕(其中10号分组包含HTTP GET消息)。

(注:可从/ethereal-labs/ethereal-traces.zip 中解压出ethernet-ethereal-trace-1文件来回答下列问题)为了回答下列问题,你需要研究一下分组细节窗口和分组内容窗口(在Ethereal中间和靠下的显示窗口)。

常用局域网协议

常用局域网协议

常用局域网协议在当今数字化的时代,局域网(Local Area Network,简称 LAN)在企业、学校、家庭等各种场景中发挥着至关重要的作用。

而要使局域网能够高效、稳定地运行,离不开一系列协议的支持。

这些协议就像是局域网中的“交通规则”,规范着数据的传输和交换。

接下来,让我们一起了解一些常用的局域网协议。

一、以太网协议(Ethernet)以太网是应用最为广泛的局域网技术之一。

它采用了一种称为“载波监听多路访问/冲突检测”(Carrier Sense Multiple Access with Collision Detection,简称 CSMA/CD)的访问控制方法。

简单来说,当一台计算机想要发送数据时,它会先监听网络线路,看看是否有其他计算机正在传输数据。

如果线路空闲,它就会开始发送数据。

但由于网络中的计算机可能会同时尝试发送数据,从而导致冲突。

当发生冲突时,发送数据的计算机都会检测到,并各自等待一段随机的时间后重新尝试发送。

以太网协议支持多种传输速率,从早期的 10Mbps 到如今常见的100Mbps、1000Mbps 甚至更高。

它具有简单、易于实现和成本低等优点,这也是其广泛应用的重要原因之一。

二、令牌环网协议(Token Ring)令牌环网是另一种早期的局域网技术。

在令牌环网中,数据传输是通过一个称为“令牌”的特殊帧来控制的。

令牌在网络中的各个节点之间依次传递。

只有拥有令牌的节点才有权利发送数据。

当一个节点完成数据发送后,令牌会被传递给下一个节点。

这种方式可以避免数据冲突的发生,但相对来说,其实现较为复杂,且在网络负载较大时,可能会出现令牌传递延迟等问题。

三、无线局域网协议(WiFi)随着无线技术的发展,无线局域网(Wireless Local Area Network,简称 WLAN)越来越普及,而 WiFi 则是其中最常见的协议之一。

WiFi 协议包括多个版本,如 80211a、80211b、80211g、80211n 和80211ac 等。

ARP请求详解

ARP请求详解

ARP请求详解/thread-520007-1.htmlIP地址是不能直接用来进行通信的。

这是因为IP地址只是主机在抽象的网络层中的地址。

若要将网络层中传送的数据报交给目的主机,还要传到链路层转变成MAC帧后才能发送到实际的网络上。

因此,不管网络层使用的是什么协议,在实际网络的链路上传送数据帧时,最终还是必须使用硬件地址。

由于IP地址有32 bit,而局域网的硬件地址是48bit,因此它们之间不存在简单的映射关系。

此外,在一个网络上可能经常会有新的主机加入进来,或撤走一些主机。

更换网卡也会使主机的硬件地址改变。

可见在主机中应存放一个从IP地址到硬件地址的映射表,并且这个映射表还必须能够经常动态更新。

地址解析协议ARP很好地解决了这些问题。

每一个主机都设有一个ARP高速缓存(ARP cache),里面有所在的局域网上的各主机和路由器的IP地址到硬件地址的映射表,这些都是该主机目前知道的一些地址。

如果不使用ARP高速缓存,那么任何一个主机只要进行一次通信,就必须在网络上用广播方式发送ARP请求分组,这就使网络上的通信量大大增加。

ARP将已经得到的地址映射保存在高速缓存中,这样就使得该主机下次再和具有同样目的地址的主机通信时,可以直接从高速缓存中找到所需的硬件地址而不必再用广播方式发送ARP请求分组。

(详解过程请参考第2页)ARP将保存在高速缓存中的每一个映射地址项目都设置生存时间(例如,10~20分钟)。

凡超过生存时间的项目就从高速缓存中删除掉。

设置这种地址映射项目的生存时间是很重要的。

设想有一种情况。

主机A和B通信。

A的ARP高速缓存里保存有B的物理地址。

但B的网卡突然坏了,B立即更换了一块,因此B的硬件地址就改变了。

A还要和B继续通信。

A 在其ARP高速缓存中查找到B原先的硬件地址,并使用该地址向B发送数据帧。

但B原先的硬件地址已经失效了,因此A无法找到主机B。

但是过了一段时间,A的ARP高速缓存中已经删除了B原先的硬件地址(因为它的存在时间到了),于是A重新广播发送ARP请求分组,又找到了B。

ETHERNET数据包格式

ETHERNET数据包格式

ETHERNET数据包格式( IP & UDP & ICMP & ARP )2010-06-21 08:28一、ETHERNET 数据包的协议类型 TYPE 的值为 0x0800:IP协议,即:ETHERTYPE_IP,该值在 /usr/include/net/ethernet.h中有定义。

ETHERNET 数据包的格式又细分为如下几种情况:(1) IP 报头中的协议号码为 IPPROTO_TCP,其值为 6 。

ETHERNET 数据包的格式如下:|<------------ Ethernet Header ---------->|-------------------------------------------------------------------------|DST MAC ADDR |SRC MAC ADDR | TYPE | IP PACKET | TCP PACKET | -------------------------------------------------------------------------|<- 6 bytes ->|<- 6 bytes ->|<- 2 bytes ->|<- 20 bytes ->|<- 20 bytes ->|如下例所示:00 00 21 cd a8 48 00 0a 98 1f 0a 8a 08 00 45 00-- -- -- -- -- -- -- -- -- -- -- -- -- --00 28 38 13 40 00 7e 06 85 48 a6 6f e5 87 a6 6f-- -- -- -- -- -- --e5 0d 04 3a 01 95 bc 5d 5a 8b 25 69 20 82 50 11-- -- -- -- -- --41 87 cc 34 00 00 00 00 00 00 00 00 00 00 00 00-- --其中作如下说明:00 00 --- 08 00 : ETHERNET PACKET,共 14 个字节00 00 21 cd a8 48 : 接收方的 MAC 地址,6 个字节00 0a 98 1f 0a 8a : 发送方的 MAC 地址,6 个字节08 00 : 协议类型,2 个字节,0x0800:IP协议,该值在/usr/include/net/ethernet.h中有定义,其值为:ETHERTYPE_IP45 00 --- e5 0d : IP PACKET ,共 20 个字节06 : 协议类型,1 是 ICMP,6 是 TCP,17 是 UDPa6 6f e5 87 : 发送方 IP 地址,4 个字节,十进制:166.111.229.135 a6 6f e5 0d : 接收方 IP 地址,4 个字节,十进制:166.111.229.1304 3a --- 00 00 : TCP PACKET,共 20 个字节04 3a : 发送方的端口号,2 个字节,其十进制表示为:1082 01 95 : 接收方的端口号,2 个字节,其十进制表示为:405 41 87 : TCP PACKET 的窗口大小(2) IP 报头中的协议号码为 IPPROTO_UDP,其值为 17 。

ARP报文格式

ARP报文格式

8比特
OP
16比特
含义
目的以太网地址。发送ARP请求时,为广播的MAC地址,0xFF.FF.FF.FF.FF.FF。 源以太网地址。 表示后面数据的类型。对于ARP请求或应答来说,该字段的值为0x0806。 表示硬件地址的类型。对于以太网,该类型的值为“1”。 表示发送方要映射的协议地址类型。对于IP地址,该值为0x0800。 表示硬件地址的长度,单位是字节。对于ARP请求或应答来说,该值为6。 表示协议地址的长度,单位是字节。对于ARP请求或应答来说,该值为4。 操作类型:
1 ARP请求 2 ARP应答 3 RARP请求 4 RARP应答
Ethernet Address of sender 48比特
IP Address of sender
32比特
Ethernet Addresf destination
32比特
发送方以太网地址。这个字段和ARP报文首部的源以太网地址字段是重复信息。 发送方的IP地址。 接收方的以太网地址。发送ARP请求时,该处填充值为0x00.00.00.00.00.00。 接收方的IP地址。
报文示例
图1 免费ARP报文格式
图2 ARP请求报文格式 图3 ARP应答报文格式
字段
长度
(bit)
Ethernet Address of destination 48比特
Ethernet Address of sender 48比特
Frame Type
16比特
Hardware Type
16比特
Protocol Type
16比特
Hardware Length
8比特
Protocol Length
博客园 用户登录 代码改变世界 密码登录 短信登录 忘记登录用户名 忘记密码 记住我 登录 第三方登录/注册 没有账户, 立即注册

发送ARP数据包

发送ARP数据包

封皮成绩评定表课程设计任务书摘要计算机网络是多个计算机的集合,在网络中的计算机若想互相通信就需要用到Ethernet 设备。

Ethernet 设备有自己全球唯一的MAC地址,它们以MAC地址来传输Ethernet数据包,但他们却不能识别IP包的IP地址。

所以,在Ethernet中进行IP通信时就需要一个协议来建立IP地址和MAC地址的对应关系。

在ARP协议中对于这种情况会发送Arp数据包用来寻找目的主机并建立对应关系用于下次传输。

关键字:物理帧 ARP帧 ip地址 mac地址目录一课程设计目的 (1)二课程设计要求 (1)三系统开发语言及环境的选择 (1)四相关知识………………………………………… 1-3 1.ARP协议的工作原理……………………1-22.ARP的包格式 (2)3.ARP包的填充………………………………2-3五课程设计过程……………………………………3-111.流程图………………………………… 3-42.源程序代码…………………………… 4-103.程序运行结果分析……………………10-11六课程设计小结 (11)七参考文献………………………………………11-12一课程设计目的1) ARP协议用于完成IP地址与MAC地址间的转换。

2) 熟悉ARP协议对于IP数据包的传输过程具有重要意义。

3) 本课程设计的主要目的是通过封装与发送ARP帧,了解ARP协议的工作原理与ARP帧的结构。

二课程设计要求根据后面介绍的ARP包结构,编写程序封装并发送ARP包。

1)以命令行形式运行:arpsend src_ip src_mac dst_ip dst_mac flag其中arpsend作为程序名。

各参数意义:src_ip: 源IP地址。

src_mac: 源MAC地址。

dst_ip: 目的IP地址。

dst_mac: 目的MAC地址。

Flag:0表示ARP请求;1表示ARP应答。

例如: Arpsend 192.168.1.1 FA:01:02:03:04:05192.168.1.2 0D:E1:02:03:B4:06 12)输出内容:ARP帧的各字数值,包括源IP地址,源MAC地址,目的IP地址,目的MAC地址等。

ARP协议解析与应用

ARP协议解析与应用

ARP协议解析与应用ARP(Address Resolution Protocol),地址解析协议,是一种用于在局域网中将IP地址解析为对应MAC地址的协议。

在计算机网络中,IP地址用于标识网络中的设备,而MAC地址则是用于标识设备的物理地址。

ARP协议的作用是通过IP地址查询对应的MAC地址,以实现数据的传输。

在本文中,我们将对ARP协议进行解析,并探讨其在实际应用中的作用与功能。

一、ARP协议概述1. ARP协议的定义ARP协议是一种地址解析协议,其作用是根据IP地址查询对应的MAC地址。

它通过广播的方式发送ARP请求,在局域网中寻找目标设备的MAC地址,以便进行数据传输。

一旦获取到目标设备的MAC地址,就可以通过以太网(Ethernet)传输层实现数据的传输。

2. ARP协议的工作原理ARP协议的工作原理可以分为以下四个步骤:a) 发送ARP请求:源设备向网络中的所有设备发送ARP请求,请求目标设备的MAC地址。

b) 目标设备响应ARP请求:目标设备接收到ARP请求后,将其MAC地址作为ARP响应发送给源设备。

c) 源设备收到ARP响应:源设备接收到目标设备的ARP响应后,将其存储在本地的ARP缓存中,以便将来的数据传输。

d) 数据传输:源设备通过目标设备的MAC地址将数据进行传输。

二、ARP协议的应用1. IP地址与MAC地址转换ARP协议的主要应用是实现IP地址与MAC地址之间的转换。

当一个设备需要与网络中的另一个设备进行通信时,首先需要知道目标设备的MAC地址,而通过ARP协议,可以通过目标设备的IP地址查询到其对应的MAC地址,从而实现数据的传输。

2. ARP缓存管理每次进行ARP请求响应之后,源设备会将目标设备的IP地址与MAC地址存储在本地的ARP缓存中,以便将来的数据传输。

ARP缓存管理是对这些缓存条目进行管理和维护的过程。

当ARP缓存中的某条目过期或者失效时,源设备会重新发送ARP请求以更新对应的MAC地址。

描述arp欺骗的原理及过程 -回复

描述arp欺骗的原理及过程 -回复

描述arp欺骗的原理及过程-回复ARP欺骗(Address Resolution Protocol spoofing)是一种网络攻击技术,攻击者通过伪造或欺骗目标网络设备的ARP信息,实现对通信进行窃听、篡改和伪装等恶意操作。

本文将详细介绍ARP欺骗的原理及过程。

一、ARP协议的基本原理在深入了解ARP欺骗之前,我们先来了解一下ARP协议的基本原理。

ARP (地址解析协议)是一种用于解析IP地址与MAC地址之间关系的协议。

在TCP/IP网络中,数据在发送时使用的是IP地址,而以太网(Ethernet)则使用MAC地址进行寻址。

ARP协议的作用就是通过查询网络上的其他设备,获取指定IP地址对应的MAC地址,从而实现数据包的转发。

ARP协议的工作方式如下:1. 当源主机要发送数据包给目标主机时,首先检查本地的ARP缓存表(ARP cache),看目标主机的MAC地址是否已经缓存。

2. 如果ARP缓存表中不存在目标主机的MAC地址,源主机会发送一个ARP请求广播,询问其他主机谁知道目标主机的MAC地址。

3. 目标主机收到ARP请求后,会发送一个ARP响应,包含自己的MAC 地址。

4. 源主机收到ARP响应后,将目标主机的IP地址和对应的MAC地址存入ARP缓存表,并将数据包发送给目标主机。

二、ARP欺骗原理ARP欺骗就是攻击者利用ARP协议的工作原理,欺骗目标主机获取其MAC地址,从而干扰或中断正常的通信。

实现ARP欺骗的关键是通过伪造ARP响应,将攻击者自己的MAC地址告诉目标主机,使其将数据包发送给攻击者。

这样,攻击者就可以窃听、篡改或伪装网络通信。

ARP欺骗的主要类型包括:1. ARP请求响应欺骗:攻击者伪造一个含有目标主机IP地址和另一个MAC地址的ARP响应,发送给本地网络中的其他主机,使其错误地认为目标主机的MAC地址是伪造的MAC地址。

这样,其他主机发送的数据包将会被错误地发送给攻击者。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《计算机网络》课程设计实验报告题目发送Ethernet ARP包学院数理与信息工程学院专业计算机科学与技术班级计科101学号************学生姓名王立娟同组成员潘明越、曾兵、田胜杰、宋炼杰、陈坦、韦国挺指导教师郭步编写日期2012-6-30目录一、程设计的目的和意义 (2)二、设计的内容和要求 (2)三、设计的相关技术 (3)3.1 ARP协议及工作原理 (3)3.2 ARP的分组格式 (3)3.3工作原理 (4)3.4 ARP包的填充 (6)四、程设计过程 (6)4.1流程图 (7)4.2源程序 (8)4.3运行结果 (18)五、课程设计小结 (19)六、参考文献 (19)一、程设计的目的和意义IP地址将不同的物理地址统一起来,从而将物理地址隐藏起来,上层软件使用IP地址标识结点。

但是。

两台计算机只有在知道彼此的物理地址时才能进行通信。

IP数据包常通过Ethernet发送。

Ethernet设备并不识别32位IP地址,它们是以48位MAC地址传输Ethernet数据包的。

因此,IP驱动器必须把IP目的地址转换成Ethernet网络目的地址。

这两种地址之间存在着某种静态的或动态的映射,通常需要查看一张表来进行这种映射。

这种地址协议(ARP)就是用来确定这些映象的协议。

ARP工作时,送出一个所希望的IP地址的Ethernet广播数据包。

目的地主机以一个含有IP和Ethernet地址对的数据包作为应答。

发送者将这个地址对高速缓存起来,以节约不必要的ARP通信。

本课程设计的目的是进一步熟悉ARP协议的帧结构以及它的运行过程。

二、设计的内容和要求2.1 基本要求本次课程设计的基本要求是在熟悉ARP协议并了解Winpcap编程,或者下载JAVA类:jpcap包构造ARP包,选择并打开网卡,将ARP包发送。

1)命令行格式:arpsend src_ip src_mac dst_ip dst_mac flag其中arpsend作为程序名。

各参数意义:src_ip: 源IP地址。

src_mac: 源MAC地址。

dst_ip: 目的IP地址。

dst_mac: 目的MAC地址。

Flag:0表示ARP请求;1表示ARP应答。

例如:arpsend 192.168.1.1 FA:01:02:03:04:05 192.168.1.2 0D:E1:02:03:B4:06 12)输出:Send OK。

3)程序的正确性的检验。

可以安装一个截包软件,如Iris,运行该软件以查看能否收到程序发出的ARP包,并检查包中个字段填充的内容(如各地址,协议类型)是否正确。

错误!未指定书签。

2. 2系统开发语言及环境的选择操作系统:Windows XP Professional运行环境:Microsoft Visual C++ 6.0开发语言:C语言,C++等三、设计的相关技术3.1 ARP协议及工作原理ARP协议是“Address Resolution Protocol”(地址解析协议)的缩写。

在局域网中,网络中实际传输的是“帧”,帧里面是有目标主机的MAC地址的。

在以太网中,一个主机要和另一个主机进行直接通信,必须要知道目标主机的MAC 地址。

但这个目标MAC地址是如何获得的呢?它就是通过地址解析协议获得的。

所谓“地址解析”就是主机在发送帧前将目标IP地址转换成目标MAC地址的过程。

ARP协议的基本功能就是通过目标设备的IP地址,查询目标设备的MAC地址,以保证通信的顺利进行。

ARP的基本运行过程是:1)主机A希望发送数据分组给主机B,但不知道B的物理地址。

2)A发送广播报文,要求B主机用它的物理地址来响应。

3)网站上所有主机都接收到这个分组。

4)B识别出自己的IP地址,发送应答报文,告诉A自己的物理地址。

3.2 ARP的分组格式图一 ARP分组格式图2 物理帧头0 8 16 24 31(位)图3 ARP帧结构3.3工作原理:源主机在传输数据前,首先要对初始数据进行封装,在该过程中会把目的主机的IP地址和MAC地址封装进去。

在通信的最初阶段,我们能够知道目的主机的IP地址,而MAC地址却是未知的。

这时如果目的主机和源主机在同一个网段内,源主机会以第二层广播的方式发送ARP请求报文。

ARP请求报文中含有源主机的IP地址和MAC地址,以及目的主机的IP地址。

当该报文通过广播方式到达目的主机时,目的主机会响应该请求,并返回ARP响应报文,从而源主机可以获取目的主机的MAC地址,同样目的主机也能够获得源主机的MAC地址。

如果目的主机和源主机地址不在同一个网段内,源主机发出的IP数据包会送到交换机的默认网关,而默认网关的MAC地址同样可以通过ARP协议获取。

经过ARP协议解析IP地址之后,主机会在缓存中保存IP地址和MAC地址的映射条目,此后再进行数据交换时只要从缓存中读取映射条目即可。

ARP协议工作原理详见图4.图4 网段内ARP工作原理关于ARP的功能,仅限于在没有安全防护的网络里。

1) 如果有多个用户都在同一个网关上网,那么若要禁止机器A上网,应该怎么做呢?就是让A得不到正确的网关的ARP映射。

可以采取如下措施:伪装成网关,给机器A发送ARP包,该ARP的发送方为网关的IP,而MAC部分随便填一个地址;接收方正确填写A的相关信息。

2)基于ARP欺骗的监听。

如果某台计算机C和计算机A、B位于同一个局域网内,那么如何监听A和B间的通信呢?很简单,对A说“我是B”,在对B说“我是A”。

具体的操作如下:给A发送一个伪造的ARP回应包,告诉A,B的IP 对应的MAC为C的MAC地址,于是A就会相应地刷新自己的ARP缓存,将发给B 的数据都发送到主机C上来。

当然,因为ARP缓存是动态的,有超时时间,所以必须每隔一段时间就给A发送一个ARP回应包。

为了不让B发现,我们还要对每次接受到的数据包进行转发。

这样就监听了A发送给B的信息。

如果想监听B发送给A的信息,方法类似。

3.4 ARP包的填充将命令行的参数作适当的转换后填到ARP分组结构的各字段中即可。

要注意的是,填充请求包时。

因为包要在Ethernet上广播,所以,物理帧头的“目的MAC”字段要填充为FFFFFFFFFFFF;而ARP帧结构中的目的MAC可填充为任意值,因为它此时不起作用。

“填充数据”字段要填充为0。

四、程设计过程4.1 流程图图5 程序流程图4.2源程序#include <iostream.h>#include <fstream.h>#include <conio.h>#include <stdio.h>#include <stdlib.h>#include <Packet32.h>#include <Ntddndis.h>#pragma comment(lib,"ws2_32.lib")// DLC头typedef struct DLCHeader{unsigned char DesMAC[6];unsigned char SrcMAC[6];unsigned short Ethertype;} DLCHEADER;// ARP桢typedef struct ARPFrame{unsigned short HW_Type;unsigned short Prot_Type;unsigned char HW_Addr_Len;unsigned char Prot_Addr_Len;unsigned short Flag;unsigned char Send_HW_Addr[6];unsigned char Send_Prot_Addr[4];unsigned char Targ_HW_Addr[6];unsigned char Targ_Prot_Addr[4]; unsigned char padding[18];} ARPFRAME;// ARP包=DLC头+ARP桢typedef struct ARPPacket{DLCHeader dlcHeader;ARPFrame arpFrame;}*PARPPACKET;ARPPacket ARPPACKET;//源文件.cpp#include <iostream.h>#include <string.h>//#include "h.h"int transIP(char *,unsigned char *);int transMAC(char *,unsigned char *); LPADAPTER lpAdapter;LPPACKET lpPacket;bool Send();void main(int argc,char *argv[]){if(argc!=6){cout<<"输入格式错误"<<endl;return;}int i=0;memset(&ARPPACKET, 0, sizeof(ARPPACKET));if(*argv[5]=='0'){for(i=0;i<6;i++)ARPPACKET.dlcHeader.DesMAC[i]=0xff;ARPPACKET.arpFrame.Flag=(unsigned short)1;}else{if(*argv[5]=='1'){//填充DLC头中目的MAC地址if(!transMAC(argv[4],ARPPACKET.dlcHeader.DesMAC))return;//ARP桢中flag位置2ARPPACKET.arpFrame.Flag=(unsigned short)0x0200;}elsecout<<"flag位输入错误"<<endl;}if(!transMAC(argv[2],ARPPACKET.dlcHeader.SrcMAC))return;//填充DLC头中桢类型ARPPACKET.dlcHeader.Ethertype=htons((unsigned short)0x0608); ARPPACKET.arpFrame.HW_Type=(unsigned short)0x0100;//(Ethernet类型)ARPPACKET.arpFrame.Prot_Type=(unsigned short)0x0008; ARPPACKET.arpFrame.HW_Addr_Len=(unsigned char)6; ARPPACKET.arpFrame.Prot_Addr_Len=(unsigned char)4;if(!transMAC(argv[2],ARPPACKET.arpFrame.Send_HW_Addr)) return;if(!transIP(argv[1],ARPPACKET.arpFrame.Send_Prot_Addr)) return;if(!transMAC(argv[4],ARPPACKET.arpFrame.Targ_HW_Addr)) return;if(!transIP(argv[3],ARPPACKET.arpFrame.Targ_Prot_Addr)) return;for(i=0;i<18;i++)ARPPACKET.arpFrame.padding[i]=0;if(!Send())cout<<"发送arp包失败"<<endl;}int transIP(char *argv,unsigned char *a){char ip[16];int i=0,j=0,k=0;strcpy(ip,argv);int m=strlen(argv);for(i=0;i<m;i++) //判断命令行输入的IP格式是否正确 {if((ip[i]<'0'||ip[i]>'9')&&ip[i]!='.'){cout<<"输入ip:"<<argv<<"格式错误"<<endl;return 0;}else{if(ip[i]!='.')j++;else{k++;if(j>3){cout<<"输入ip:"<<argv<<"格式错误"<<endl; return 0;}else{j=0;}if(k>3){cout<<"输入ip:"<<argv<<"格式错误"<<endl; return 0;}}}}j=0;for(i=0;i<4;i++) //填充IP地址 {while(*(ip+j)<'0'||*(ip+j)>'9')j++;a[i]=(unsigned char)atoi(ip+j);while(*(ip+j)>='0'&&*(ip+j)<='9')j++;}return 1;}int transMAC(char *argv,unsigned char *b){char mac[18];int i=0,j=0,k=0;strcpy(mac,argv);int m=strlen(argv);for(i=0;i<m;i++) //判断命令行输入的MAC地址是否正确{if(mac[i]<'0'||(mac[i]>':'&&mac[i]<'A')||(mac[i]>'Z'&&mac[i]<'a')||mac[i]>'Z') {cout<<"输入mac:"<<argv<<"格式错误"<<endl;return 0;}else{if(mac[i]!=':')j++;else{k++;if(j>2){cout<<"输入mac"<<argv<<"格式错误"<<endl;return 0;}else{j=0;}if(k>5){cout<<"输入mac"<<argv<<"格式错误"<<endl;return 0;}}}}for(i=0;i<6;i++) //填充MAC地址{while(*(mac+j)==':'||*(mac+j)=='-')j++;if(*(mac+j)>='0'&&*(mac+j)<='9')b[i]=(unsigned char)(*(mac+j)-'0');if(*(mac+j)>='a'&&*(mac+j)<='z')b[i]=(unsigned char)(*(mac+j)-'a'+10);if(*(mac+j)>='A'&&*(mac+j)<='z')b[i]=(unsigned char)(*(mac+j)-'A'+10);j++;b[i]*=16;if(*(mac+j)>='0'&&*(mac+j)<='9')b[i]+=(unsigned char)(*(mac+j)-'0');if(*(mac+j)>='a'&&*(mac+j)<='z')b[i]+=(unsigned char)(*(mac+j)-'a'+10); if(*(mac+j)>='A'&&*(mac+j)<='z')b[i]+=(unsigned char)(*(mac+j)-'A'+10); j++;}return 1;}bool Send(){char AdapterNameA[8192];char AdapterNameU[2*sizeof(AdapterNameA)];unsigned long AdapterAlength=sizeof(AdapterNameA);unsigned long AdapterUlength=2*sizeof(AdapterNameA);DWORD dwVersion=GetVersion ();DWORD dwWindowsMajorVersion=(DWORD)(LOBYTE(LOWORD(dwVersion)));if(!(dwVersion >= 0x80000000 && dwWindowsMajorVersion >=4)){//Windows NT//获取UNICODE码网卡名列表if(PacketGetAdapterNames(AdapterNameU,&AdapterUlength)==FALSE) {cout<<"无法得到网卡列表!"<<endl;return FALSE;}//将第一个网卡名转为ASCII码unsigned short *pAdapterName=(unsigned short *)AdapterNameU; for(unsigned i=0;i<AdapterAlength;i++)if((AdapterNameA[i]=(char)pAdapterName[i])=='\0')break;}else{//Windows 9x//获取ASCII码网卡名列表if(PacketGetAdapterNames(AdapterNameA,&AdapterAlength)==FALSE) {cout<<"无法得到网卡列表!"<<endl;return FALSE;}}lpAdapter=PacketOpenAdapter(AdapterNameA);if(!lpAdapter||lpAdapter->hFile==INVALID_HANDLE_VALUE){cout<<"无法打开网卡,错误码:"<<GetLastError()<<endl;return FALSE;}//发送帧LPPACKET lpPacket; //分配发送包结构if((lpPacket=PacketAllocatePacket())!=NULL){//初始化发送包结构PacketInitPacket(lpPacket,&ARPPACKET,sizeof(ARPPACKET)); // 每次只发送一个包PacketSetNumWrites(lpAdapter,1);//发送包if(PacketSendPacket(lpAdapter,lpPacket,true)==1){cout<<"send ok"<<endl;}else{cout<<"发送包失败"<<endl;PacketFreePacket(lpPacket); //释放发送包结构}}else{cout<<"分配发送包LPPACKET结构失败!"<<endl;}PacketCloseAdapter(lpAdapter);return TRUE;}4.3运行结果1.应该在预编译代码区加上预编译指令:#pragma comment(lib, "ws2_32.lib");否则,链接时会出现符号无法解析的错误。

相关文档
最新文档