3,882
社区成员




socket定义如下(伪代码):
sock = socket(AF_INET,SOCK_RAW,IPPROTO_IP);
setsockopt(sock, IPPROTO_IP, IP_HDRINCL, true);
//第一种发送方式
connect(sock,destAddr);
send(sockClient,sendBuf,dataSize);
//第二种-------------------------------------------------
sendto(sock, sendBuf, dataSize, destAddr);
//计算检验和函数,完全抄别人的
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);
}
//后来干脆抓去一个能正常发送的数据包自己在用原始套接字发送一次 效果一样
sendBuf =[]{
0x45,0x00,0x00,0x34,0x20,0x49,0x40,0x00,0x80,0x06,0x50,0x05,0xac,0x10,0x08,0x98,
0xb4,0x61,0x21,0x6c,0x56,0x11,0x00,0x15,0x98,0x47,0x67,0x6a,0x00,0x00,0x00,0x00,
0x80,0x02,0x20,0x00,0x6e,0xc8,0x00,0x00,0x02,0x04,0x05,0xb4,0x01,0x03,0x03,0x02,
0x01,0x01,0x04,0x02
};
//SOCKET sock = socket(AF_INET,SOCK_RAW,IPPROTO_IP);
SOCKET sock=WSASocket(AF_INET,SOCK_RAW,IPPROTO_RAW/*IPPROTO_IP*/,NULL,0,WSA_FLAG_OVERLAPPED);
printf("sock:%d\r\n",sock);
BOOL set = TRUE;
printf("set:%d\r\n",setsockopt(sock, IPPROTO_IP, IP_HDRINCL, (char *)&set, sizeof(set)));
connect(sock,(struct sockaddr*)&DestAddr,sizeof(DestAddr));
//printf("send:%d\r\n", sendto(sock, ch, 0x34, 0, (struct sockaddr*) &DestAddr, sizeof(DestAddr)));
printf("send:%d\r\n", send(sock,SendBuf,datasize,NULL));
printf("error:%d",WSAGetLastError());