发送Ethernet ARP包
一、课程设计目的
IP地址将不同的物理地址统一起来,从而将物理地址隐藏起来,上层软件使用IP地址标识结点。但是。两台计算机只有在知道彼此的物理地址时才能进行通信。
IP数据包常通过Ethernet发送。Ethernet设备并不识别32位IP地址,它们是以48位MAC地址传输Ethernet数据包的。因此,IP驱动器必须把IP目的地址转换成Ethernet网络目的地址。这两种地址之间存在着某种静态的或动态的映射,通常需要查看一张表来进行这种映射。这种地址协议(ARP)就是用来确定这些映象的协议。
ARP工作时,送出一个所希望的IP地址的Ethernet广播数据包。目的地主机以一个含有IP和Ethernet地址对的数据包作为应答。发送者将这个地址对高速缓存起来,以节约不必要的ARP通信。
本课程设计的目的是进一步熟悉ARP协议的帧结构以及它的运行过程
二、课程设计要求
在熟悉ARP协议并了解Winpcap编程的前提下,构造ARP包,选择并打开网卡,将
ARP包发送出去。
1) 命令行格式:
arpsend src_ip src_mac dst_mac flag 其中arpsend作为程序名。 各参数意义:
src_ip: 源IP地址。 src_mac: 源MAC地址。 dst_ip: 目的IP地址。
dst_mac: 目的MAC地址。
Flag:0表示ARP请求;1表示ARP应答。
三、课程设计相关知识
1. ARP协议概述
ARP,即地址解析协议,实现通过IP地址得知其物理地址。在TCP/IP网络环境下,每个主机都分配了一个32位的IP地址,这种互联网地址是在网际范围标识主机的一种逻辑地址。为了让报文在物理网路上传送,必须知道对方目的主机的物理地址。这样就存在把IP地址变换成物理地址的地址转换问题。以以太网环境为例,为了正确地向目的主机传送报文,必须把目的主机的32位IP地址转换成为48位以太网的地址。这就需要在互连层有一组服务将IP地址转换为相应物理地址,这组协议就是ARP协议。 2.ARP工作原理
我们以主机A(192.168.1.5)向主机B(192.168.1.1)发送数据为例。当发送数据时,主机A会在自己的ARP缓存表中寻找是否有目标IP地址。如果找到了,也就知道了目标MAC地址,直接把目标MAC地址写入帧里面发送就可以了;如果在ARP缓存表中没有找到相对应的IP地址,主机A就会在网络上发送一个广播,目标MAC地址是“FF.FF.FF.FF.FF.FF”,这表示向同一网段内的所有主机发出这样的询问:“192.168.1.1的MAC地址是什么?”网络上其他主机并不响应ARP询问,只有主机B接收到这个帧时,才向主机A做出这样的回应:“192.168.1.1的MAC地址是00-aa-00-62-c6-09”。这样,主机
A就知道了主机B的MAC地址,它就可以向主机B发送信息了。同时它还更新了自己的ARP缓存表,下次再向主机B发送信息时,直接从ARP缓存表里查找就可以了。ARP缓存表采用了老化机制,在一段时间内如果表中的某一行没有使用,就会被删除,这样可以大大减少ARP缓存表的长度,加快查询速度。 3、ARP包的填充
将命令行的参数作适当的转换后填到ARP分组结构的各字段中即可。
要注意的是,填充请求包时。因为包要在Ethernet上广播,所以,物理帧头的“目的MAC”字段要填充为FFFFFFFFFFFF;而ARP帧结构中的目的MAC可填充为任意值,因为它此时不起作用。“填充数据”字段要填充为0
四、课程设计分析
1.程序流程
2.核心代码及说明 头文件: #pragma once
//#include
//#pragma comment(lib, \#pragma comment(lib, \
#pragma comment(lib, \#define MAX_ADAPTER 10 #define MAX_ARP
20
// 网卡信息
typedef struct AdapterInfo {
char szDeviceName[128]; // 名字 char szIPAddrStr[16]; // IP
char szHWAddrStr[18]; // MAC DWORD dwIndex; // 编号 }INFO_ADAPTER, *PINFO_ADAPTER;
// ARP条目信息
typedef struct ARPInfo {
char szIPAddrStr[16]; // IP
char szHWAddrStr[18]; // MAC
DWORD dwType; // 类型 }INFO_ARP, *PINFO_ARP;
class CSysInfo { public:
CSysInfo(void); ~CSysInfo(void);
static void AddAdapInfoToList(CListCtrl& list);
static void AddARPInfoToList(CListCtrl& list,const short nAdpaterIndex);
inline static char* GetCurAdapterName(const short nAdapterIndex) // 返回对应网
卡名字 { return AdapterList[nAdapterIndex].szDeviceName; }
static char* GetCurAdapterMAC(const short nAdapterIndex); // 返回对应网卡MAC
inline static char* GetCurAdapterIP(const short nAdapterIndex) //返回对应网卡IP { }
static void formatStrToMAC(const LPSTR lpHWAddrStr,unsigned char *HWAddr);//
return AdapterList[nAdapterIndex].szIPAddrStr;
用户输入的MAC地址字符串赋给数据包结构体
private: static INFO_ADAPTER 表 static INFO_ARP };
AdapterList[ MAX_ADAPTER]; // 网卡列
]; // ARP列表
ARPList[MAX_ARP
static void formatMACToStr(LPSTR lpHWAddrStr,const unsigned char *HWAddr);
源代码:
#include \
#include \
INFO_ADAPTER CSysInfo::AdapterList[MAX_ADAPTER]; INFO_ARP CSysInfo::ARPList[MAX_ARP];
CSysInfo::CSysInfo(void) { }
CSysInfo::~CSysInfo(void) { }
void CSysInfo::AddAdapInfoToList(CListCtrl& list)//获得系统的网卡信息,并将其添加到list控件中 {
char tempChar;
ULONG uListSize=1; PIP_ADAPTER_INFO pAdapter; // 定义PIP_ADAPTER_INFO结构存储网卡信息 int nAdapterIndex = 0;
DWORD dwRet = GetAdaptersInfo((PIP_ADAPTER_INFO)&tempChar, &uListSize);
// 关键函数,调用GetAdaptersInfo函数获取网络需求缓冲区信息,并存到uListSize中
if
(dwRet
==
ERROR_BUFFER_OVERFLOW)
//
调
用
GetAdaptersInfo((PIP_ADAPTER_INFO)&tempChar, &uListSize)成功
{
PIP_ADAPTER_INFO pAdapterListBuffer = (PIP_ADAPTER_INFO)new(char[uListSize]);//给pAdapterInfo分配uListSize大小的内存空间
dwRet = GetAdaptersInfo(pAdapterListBuffer, &uListSize);//获取网络信息,并存
储到pAdapterListBuffer
if (dwRet == ERROR_SUCCESS)//GetAdaptersInfo(pAdapterInfo,&uListSize)函数成功 {
调
用
pAdapter = pAdapterListBuffer;
while (pAdapter) // 枚举网卡,然后将相关条目添
加到List中 {
CString strTemp = pAdapter->AdapterName; // 网卡名字 strTemp = \ // 加上前缀 list.InsertItem(nAdapterIndex,strTemp); strcpy(AdapterList[nAdapterIndex].szDeviceName,strTemp);
strcpy(AdapterList[nAdapterIndex].szIPAddrStr, pAdapter->IpAddressList.IpAddress.String );// IP
list.SetItemText(nAdapterIndex,1,AdapterList[nAdapterIndex].szIPAddrStr);
AdapterList[nAdapterIndex].szHWAddrStr,
formatMACToStr( pAdapter->Address ); // MAC
list.SetItemText(nAdapterIndex,2,AdapterList[nAdapterIndex].szHWAddrStr);
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说教育文库计算机网络课程设计在线全文阅读。
相关推荐: