我用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);
}

解决方案 »

  1.   

    如果是发给网内的主机,并且对方没有过滤掉icmp echo request报文的话,应该是能收到的。你可以ping一下对方,看看能否有回应,然后按照ping出去的报文的内容构造你自己的包,看看校验和等是否是正确的。
      

  2.   

    可以ping通
     
    是不是构造数据包时有什么大小或其他的要求?
      

  3.   

    大小可以说不是问题,你总不会发送一条大于1500字节的icmp echo-request报文吧!很大可能是校验和算的不对,对方丢弃了。哦,还有,你要保证你和对方主机是在同一个网段内!不然就要路由出去了,MAC地址只能是网关的而不能是网外主机的。
      

  4.   

    ip 头中的校验和算法 与icmp 头中的校验和算法应该是一样的吧
      

  5.   

    TCP/IP各协议的校验和算法都一样的,16位和取反码。