我用winpcap构造的原是数据包,可以检测到数据包经过发出去了,但就是没有回应!
mac 地址和ip地址经过反复验证并没错.郁闷死,兄弟姐妹们,帮帮小弟吧
谢谢先,
是不是构造数据包时有问题啊?我把构造数据包的过程贴在下面:void InitPack(unsigned long desIP)
{
unsigned char Icmpbuffer[sizeof(icmphdr)];
unsigned char Iphbuffer[sizeof(iphdr)];
int len=sizeof(icmphdr);
//unsigned char ethbuffer[sizeof(ehdr)];
icmphdr* pIcmph=(icmphdr*)Icmpbuffer;
iphdr* pIph=(iphdr*)Iphbuffer;
ehdr* pEth=(ehdr*)Sendbuffer;
/*****构造icmp数据包******/
pIcmph->Code=0;
pIcmph->Type=8;
pIcmph->ID=(USHORT)GetCurrentProcessId();
pIcmph->Checksum=0;
pIcmph->Seq=0;
for(int i=0;i<32;i++)pIcmph->Data[i]='A';
/***** 计算校验和****/
pIcmph->Checksum=checksum(( USHORT* )pIcmph,sizeof(icmphdr)); /******构造ip头********/
pIph->ver_ihl=(4<<4 | sizeof(iphdr)/sizeof(unsigned long));
pIph->tlen=htons(sizeof(iphdr)+sizeof(icmphdr));
pIph->ttl=128;
pIph->proto=1;
pIph->tos=0;
pIph->identification=1;
pIph->flags_fo=0;
pIph->crc=0;
char FAR name[10];
if(gethostname(name,10)!=0)AfxMessageBox("get name error");
PHOSTENT hostinfo=gethostbyname(name);
m_LocalIp = inet_ntoa (*(struct in_addr *)*hostinfo->h_addr_list);
pIph->saddr=inet_addr(m_LocalIp);
pIph->daddr=desIP; //目的ip地址 /***** 计算校验和****/
pIph->crc=checksum(( USHORT* )pIph,sizeof(iphdr));
pEth->eh_dst[0]=0x00; //目的mac地址
pEth->eh_dst[1]=0x0b;
pEth->eh_dst[2]=0x5f;
pEth->eh_dst[3]=0xe2;
pEth->eh_dst[4]=0x3c;
pEth->eh_dst[5]=0xc6;
getmac(pEth->eh_src);
pEth->eh_type=0x0800;
memcpy(Sendbuffer,pEth,14);
memcpy(Sendbuffer+14,pIph,20);
memcpy(Sendbuffer+34,pIcmph,40);
}
//计算校验和函数
USHORT checksum(USHORT *buffer, int size)
{
unsigned long cksum = 0;
while (size > 1) {
cksum += *buffer++;
size -= sizeof(USHORT);
}
if (size) {
cksum += *(UCHAR*)buffer;
}
cksum = (cksum >> 16) + (cksum & 0xffff);
cksum += (cksum >> 16);
return (USHORT)(~cksum);
}
mac 地址和ip地址经过反复验证并没错.郁闷死,兄弟姐妹们,帮帮小弟吧
谢谢先,
是不是构造数据包时有问题啊?我把构造数据包的过程贴在下面:void InitPack(unsigned long desIP)
{
unsigned char Icmpbuffer[sizeof(icmphdr)];
unsigned char Iphbuffer[sizeof(iphdr)];
int len=sizeof(icmphdr);
//unsigned char ethbuffer[sizeof(ehdr)];
icmphdr* pIcmph=(icmphdr*)Icmpbuffer;
iphdr* pIph=(iphdr*)Iphbuffer;
ehdr* pEth=(ehdr*)Sendbuffer;
/*****构造icmp数据包******/
pIcmph->Code=0;
pIcmph->Type=8;
pIcmph->ID=(USHORT)GetCurrentProcessId();
pIcmph->Checksum=0;
pIcmph->Seq=0;
for(int i=0;i<32;i++)pIcmph->Data[i]='A';
/***** 计算校验和****/
pIcmph->Checksum=checksum(( USHORT* )pIcmph,sizeof(icmphdr)); /******构造ip头********/
pIph->ver_ihl=(4<<4 | sizeof(iphdr)/sizeof(unsigned long));
pIph->tlen=htons(sizeof(iphdr)+sizeof(icmphdr));
pIph->ttl=128;
pIph->proto=1;
pIph->tos=0;
pIph->identification=1;
pIph->flags_fo=0;
pIph->crc=0;
char FAR name[10];
if(gethostname(name,10)!=0)AfxMessageBox("get name error");
PHOSTENT hostinfo=gethostbyname(name);
m_LocalIp = inet_ntoa (*(struct in_addr *)*hostinfo->h_addr_list);
pIph->saddr=inet_addr(m_LocalIp);
pIph->daddr=desIP; //目的ip地址 /***** 计算校验和****/
pIph->crc=checksum(( USHORT* )pIph,sizeof(iphdr));
pEth->eh_dst[0]=0x00; //目的mac地址
pEth->eh_dst[1]=0x0b;
pEth->eh_dst[2]=0x5f;
pEth->eh_dst[3]=0xe2;
pEth->eh_dst[4]=0x3c;
pEth->eh_dst[5]=0xc6;
getmac(pEth->eh_src);
pEth->eh_type=0x0800;
memcpy(Sendbuffer,pEth,14);
memcpy(Sendbuffer+14,pIph,20);
memcpy(Sendbuffer+34,pIcmph,40);
}
//计算校验和函数
USHORT checksum(USHORT *buffer, int size)
{
unsigned long cksum = 0;
while (size > 1) {
cksum += *buffer++;
size -= sizeof(USHORT);
}
if (size) {
cksum += *(UCHAR*)buffer;
}
cksum = (cksum >> 16) + (cksum & 0xffff);
cksum += (cksum >> 16);
return (USHORT)(~cksum);
}
解决方案 »
- 主对话框调用子对话框控件的成员函数出现Debug Assertion Failed错误
- 求助!为客户端程序,添加windows服务
- C++软件开发 职业定位
- LISTBOX中的文字怎么对不齐?
- SDI中,View调用同属于SDI的TreeCtrl成员函数问题!
- 怎么编程进行CDMA拨号,使用RAS可以做ADSL拨号,但对CDMA不行,求助!!!
- 新手问题.如何在MFC中实现类似VB中的控件数组的功能?
- 如何使对话框有最小化以及还原按钮?
- 这样让一个窗口没有边,即BORDER=0
- 内存映射如何映射大文件,超过4G就报磁盘空间不足?
- 如何判断发送缓冲区最后一个字节发送完毕,救命!
- 用VC如何实现当点上一个如树形的节点时,点击鼠标右键,出现一个菜单,再按菜单上的条目,它就会出现一个建立的条目 。
是不是构造数据包时有什么大小或其他的要求?