在udp头与ip头之间总有21字节的0? ptr=(unsigned short *)buf;
    memcpy(ptr, &ipHdr, sizeof(ipHdr)); 
    ptr += sizeof(ipHdr);
                       //再次出用ptr-=21;就收不到了
   memcpy(ptr, &udpHdr, sizeof(udpHdr)); 
    ptr += sizeof(udpHdr);  
      memcpy(ptr, &strMessage, sizeof(strMessage));
    
iUdpChecksumSize =sizeof(ipHdr)+sizeof(udpHdr)+sizeof(strMessage);
   cksum = checksum((USHORT *)buf, iUdpChecksumSize);   ipHdr.ip_checksum=cksum;

   
ptr=(unsigned short *)buf;
    memcpy(ptr, &ipHdr, sizeof(ipHdr)); 
    ptr += sizeof(ipHdr);
    
    memcpy(ptr, &udpHdr, sizeof(udpHdr)); 
    ptr += sizeof(udpHdr);        memcpy(ptr, &strMessage, sizeof(strMessage));
iUdpChecksumSize =sizeof(ipHdr)+sizeof(udpHdr)+sizeof(strMessage);
 ret = sendto(s, buf, iTotalSize, 0, (struct sockaddr*)&remote,sizeof(remote));

解决方案 »

  1.   

    SOCKET已经实现了IP层和传输层的功能,你发送的报文里没有必要在自己加入IP头和UDP头了。
    注意初始化socket时,socket类型指定为SOCK_DGRAM。
    sendto地地址参数设置好。
      

  2.   

    我已经设置了SOCKET是它可以发我的报文
     s=WSASocket(AF_INET,SOCK_RAW,IPPROTO_RAW,NULL,0,WSA_FLAG_OVERLAPPED);
     bOpt = TRUE;
     int ret;
      ret = setsockopt(s, IPPROTO_IP, IP_HDRINCL, (char *)&bOpt, sizeof(bOpt));
      

  3.   

    检查一下你定义的IP头结构体吧,有没有设置Ipoption
      

  4.   

    没有设置Ipoption
    应该怎样做?
      

  5.   

    是用setsocketopt()吗,我设置过了