⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 test.c

📁 这是tftp协议的具体实现
💻 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 + -