📄 test.c
字号:
typedef unsigned char u8; //unsigned chartypedef unsigned short u16; //unsigned shorttypedef unsigned int u32; //unsigned int struct MAC{ u8 bDstMac[6]; u8 bSrcMac[6]; u16 wMacType;}__attribute__((packed)) Mac, *MacHead;struct IPHEAD{ u8 bHeadLen:4; u8 bVersion:4; u8 bTos; // type of service u16 wTotalLen; //IP数据包总长度,不包括MACHEAD部 u16 wIdent; // unique identifier u16 wFlags; u8 bTtl; u8 bTransType; //传输层协议类型(TCP,UDP,ICMP等) u16 wChecksum; u32 nSrcIp; u32 nDstIp;}__attribute__((packed)) Ip, *IpHead;struct VUDPHEAD{ u32 nSrcIp; u32 nDstIp; u8 bZero; u8 bProto; u16 wUdpLen;}__attribute__((packed)) Vudp, *VudpHead;struct UDPHEAD{ u16 wSrcPort; //Source port u16 wDstPort; //Destination port u16 wLen; //Datagram length u16 wCheckSum; //Checksum}__attribute__((packed)) Udp, *UdpHead;u16 Checksum(u16 *pwData,u32 nSize){ u32 nChksum=0; while(nSize>1){ nChksum+=*pwData++; nSize-=sizeof(u16); } if(nSize) nChksum+=*(u8*)pwData; nChksum=(nChksum>>16)+(nChksum&0xffff); nChksum+=(nChksum>>16); return (u16)(~nChksum);}int BuildPacket(u8 *PacketPage, u8 *FileName){ int i, j , useLen, macLen, ipLen, vudpLen, udpLen, tmpInt; char tmpCh, *tmp8; u16 *tmp16; u32 *tmp32; u8 MacInit[6]={0x00,0x11,0x22,0x33,0x44,0x55} ; u8 HostMac[6]={0x00,0x14,0x38,0x12,0x0a,0xbf}; u8 HostIp[]={0xc0,0xa8,0x00,0x01}; u8 ClientIp[]={0xc0,0xa8,0x00,0x6f}; char Prot[]={"octet"}; //MacHead build for(i = 0; i < 6; i++) { Mac.bDstMac[i] = HostMac[i]; Mac.bSrcMac[i] = MacInit[i]; } Mac.wMacType = 0x0800; MacHead = &Mac; macLen=14; // IpHead build Ip.bHeadLen = 0x5; Ip.bVersion = 0x4; Ip.bTos = 0; Ip.wTotalLen = 0x0042; Ip.wIdent = 0x0000; Ip.wFlags = 0x4000; Ip.bTtl = 0x40; Ip.bTransType = 0x11; Ip.wChecksum = 0; Ip.nSrcIp = (ClientIp[0]<<8)|(ClientIp[1]<<8)|(ClientIp[2]<<8)|(ClientIp[3]<<8); Ip.nDstIp = (HostIp[0]<<8)|(HostIp[1]<<8)|(HostIp[2]<<8)|(HostIp[3]<<8); IpHead = &Ip; ipLen=20; IpHead->wChecksum=Checksum((u16 *)IpHead,20); //UseData vudpLen=12; udpLen=8; tmpInt=macLen+ipLen+vudpLen+udpLen; PacketPage[tmpInt]=0x00; PacketPage[tmpInt+1]=0x01; for(i=0;FileName[i]!='\0';i++) PacketPage[2+tmpInt+i]=FileName[i]; for(j=0;Prot[j]!='\0';j++) PacketPage[i+1+j+tmpInt]=Prot[j]; useLen=i+j+4; // VudpHead build Vudp.nSrcIp= IpHead->nSrcIp; Vudp.nDstIp= IpHead->nDstIp; Vudp.bZero= 0; Vudp.bProto= 0x11; Vudp.wUdpLen=useLen+udpLen; VudpHead = &Vudp; vudpLen=12; //UdpHead build Udp.wSrcPort = 0xb315; Udp.wDstPort =0x45 ; Udp.wLen=useLen+udpLen; Udp.wCheckSum=0x0; UdpHead = &Udp; //to link *(struct MAC *)PacketPage= *MacHead; *(struct IPHEAD *)(PacketPage+macLen)=*IpHead; for(i=0;i<4;i++) { PacketPage[macLen+12+i]=ClientIp[i]; PacketPage[macLen+16+i]=HostIp[i]; } *(struct VUDPHEAD *)(PacketPage+macLen+ipLen)=*VudpHead;// *(PacketPage+macLen+ipLen)=VudpHead; *(struct UDPHEAD *)(PacketPage+macLen+ipLen+vudpLen)=*UdpHead; for(i=0;i<77;i++) printf("%x",PacketPage[i]); //clear VudpHead/* tmpInt = macLen+ipLen; for(i=0;i<udpLen+useLen;i++) { PacketPage[tmpInt+i]=PacketPage[tmpInt+vudpLen+i]; } for(i=0;i<vudpLen;i++) { PacketPage[tmpInt+udpLen+useLen+i]='\0'; }*/ return macLen+ipLen+udpLen+useLen;}int main(){ int i = 0, len; char PacketPage[1024], FileName[]={"abcdefghijklmnopqrstuvwxyz"}; len=BuildPacket(PacketPage, FileName); printf("len = %d\n",len); for(i=0;i<len;i++){ if(i%10==0) printf("\n"); printf("%x",PacketPage[i]); } return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -