请求回应的icmp数据包得不到回应,都是什么原因造成的?

huntwolf 2004-06-08 10:45:10
我用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);
}
...全文
1793 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
halk 2004-06-12
  • 打赏
  • 举报
回复
TCP/IP各协议的校验和算法都一样的,16位和取反码。
huntwolf 2004-06-12
  • 打赏
  • 举报
回复
ip 头中的校验和算法 与icmp 头中的校验和算法应该是一样的吧
halk 2004-06-08
  • 打赏
  • 举报
回复
大小可以说不是问题,你总不会发送一条大于1500字节的icmp echo-request报文吧!

很大可能是校验和算的不对,对方丢弃了。

哦,还有,你要保证你和对方主机是在同一个网段内!不然就要路由出去了,MAC地址只能是网关的而不能是网外主机的。
huntwolf 2004-06-08
  • 打赏
  • 举报
回复
可以ping通

是不是构造数据包时有什么大小或其他的要求?
自由的风 2004-06-08
  • 打赏
  • 举报
回复
人家有防火墙,当然.................................
halk 2004-06-08
  • 打赏
  • 举报
回复
如果是发给网内的主机,并且对方没有过滤掉icmp echo request报文的话,应该是能收到的。你可以ping一下对方,看看能否有回应,然后按照ping出去的报文的内容构造你自己的包,看看校验和等是否是正确的。
sevencat 2004-06-08
  • 打赏
  • 举报
回复
人家机器屏蔽了ICMP包
nkwesley 2004-06-08
  • 打赏
  • 举报
回复
可能你的“计算校验和”有问题

18,363

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧