#include <iostream.h>
#include <string.h>
#include "sdfg.h"
#pragma comment(lib,"ws2_32.lib")
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位置2
ARPPACKET.arpFrame.Flag=(unsigned short)0x0200;
}
else
cout<<"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;
}
没有合适的资源?快使用搜索试试~ 我知道了~
发送Ethernet+ARP数据包(编译好了)
共14个文件
pdb:2个
obj:1个
h:1个
4星 · 超过85%的资源 需积分: 25 42 下载量 17 浏览量
2013-06-25
11:41:01
上传
评论 4
收藏 1.54MB ZIP 举报
温馨提示
发送Ethernet+ARP数据包源程序,可运行,运行时需要导入一些头文件,可作为计算机网络课程设计资料
资源推荐
资源详情
资源评论
收起资源包目录
C++源程序发送Ethernet+ARP数据包.zip (14个子文件)
llll
llll.dsw 533B
sdfg.h 1002B
llll.dsp 4KB
Debug
vc60.pdb 92KB
vc60.idb 161KB
llll.pch 3.75MB
llll.exe 204KB
llll.pdb 409KB
llll.ilk 236KB
asdf.obj 26KB
llll.opt 48KB
asdf.cpp 5KB
llll.ncb 33KB
llll.plg 242B
共 14 条
- 1
资源评论
- 也傍桑阴学种瓜2015-05-27之前下载,但是不知道怎么测试代码。后来在一份报告中知道直接是在控制台来运行的,除此之外,还需要调用另外的包才可以。没有错误,不错。
- 3495980742014-05-17这个程序是极好的,基本上不能运行
- qq2829966922014-11-25资源待测试。
- qian_1234562019-03-14待测试,不知道有没有用
小博测试成长之路
- 粉丝: 1w+
- 资源: 42
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功