在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));
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));
注意初始化socket时,socket类型指定为SOCK_DGRAM。
sendto地地址参数设置好。
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));
应该怎样做?