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

📄 protocol.c

📁 利用51单片机对RTL8109进行控制
💻 C
📖 第 1 页 / 共 3 页
字号:
	unsigned char i,length;

	txdnet.tcpframe.tcpdata[0]=0x55;
	txdnet.tcpframe.tcpdata[1]=0xaa;
	txdnet.tcpframe.tcpdata[2]=0x2;
	txdnet.tcpframe.tcpdata[3]=rxdnet.tcpframe.tcpdata[3];

	for(i=0;i<3;i++){txdnet.etherframe.destnodeid[i]=ping_ethernet_address.words[i];}

	txdnet.tcpframe.sourceport=rxdnet.tcpframe.destport;
        txdnet.tcpframe.destport=rxdnet.tcpframe.sourceport;
        txdnet.tcpframe.seqnumber=1;
        txdnet.tcpframe.acknumber=1;
        txdnet.tcpframe.offset=0x50;
        txdnet.tcpframe.control=tcp_ack; //syn+ack
        txdnet.tcpframe.window=512;
        txdnet.tcpframe.urg=0;
        txdnet.tcpframe.crc=0;
        txdnet.ipframe.destip[0]=rxdnet.ipframe.sourceip[0];
        txdnet.ipframe.destip[1]=rxdnet.ipframe.sourceip[1];
        txdnet.ipframe.sourceip[0]=my_ip_address.words[0];
        txdnet.ipframe.sourceip[1]=my_ip_address.words[1];
        txdnet.ipframe.ttl=0;
        txdnet.ipframe.protocal=6;//tcp
        txdnet.ipframe.crc=20+4;

	txdnet.tcpframe.crc=createtcpcrc();

	txdnet.etherframe.protocal=0x0800;//协议为ip协议
    	txdnet.ipframe.verandihl=0x45;//版本和头长度
    	txdnet.ipframe.ttl=128;//ttl
        txdnet.ipframe.typeofserver=0x00;//服务类型
    	txdnet.ipframe.crc=0;
        txdnet.ipframe.frameindex=frameindex++;
        txdnet.ipframe.segment=0x4000;//没有分段

        length=44;

        txdnet.ipframe.totallength=length;
        txdnet.ipframe.protocal=6;//下层协议
    	txdnet.ipframe.destip[0]=rxdnet.ipframe.sourceip[0];//对方ip
    	txdnet.ipframe.destip[1]=rxdnet.ipframe.sourceip[1];
    	txdnet.ipframe.sourceip[0]=my_ip_address.words[0];//本机ip
    	txdnet.ipframe.sourceip[1]=my_ip_address.words[1];
    	txdnet.ipframe.crc=createipheadcrc();
    	length=length+14;//6+6+2
    	send_packet(length);
        txdnet.etherframe.length=length;
}

void FunRecvTcpAck(void)
{
	unsigned char i;

	i=rxdnet.tcpframe.tcpdata[3];

	retransmit_buffer[i].rtframe.status=0;
	//send_hex(msec);//.
}

void FunProcessReduceTcp(void)
{
	unsigned char i,j,temp,temp1;

	if(rxdnet.tcpframe.tcpdata[0]==0x55)
	{
		if(rxdnet.tcpframe.tcpdata[1]==0xaa)
		{
			//FunSendRemoteAddr();

	/*		if((ping_ip_address.words[0]==rxdnet.ipframe.sourceip[0]) && (ping_ip_address.words[1]==rxdnet.ipframe.sourceip[1]))
			{
				c_net_delay=2;
			}
			else*/
			{
			temp1=rxdnet.tcpframe.tcpdata[2];

			if(temp1==0x2)
			{
				FunRecvTcpAck();//确认包
				return;
			}


				if(c_type==2)return;

			//	if(c_net_delay==0)
				{
					for(i=0;i<2;i++)
					{ping_ip_address.words[i]=rxdnet.ipframe.sourceip[i];}

					if((ping_ip_address.dwords&mask_ip_address.dwords)==(my_ip_address.dwords&mask_ip_address.dwords))
                                        {//表示位于同一子网.
        	                             	for(i=0;i<3;i++){ping_ethernet_address.words[i]=0xffff;}
                                        }
                                        else//表示属于不同的子网,需要通过网关.
                                        {
                                           	ping_ip_address_ttl=10;
                                                for(j=0;j<6;j++)
                                                {
                                           		ping_ethernet_address.bytes[j]=gateway_ethernet_address.bytes[j];
                                                }
                                          	if(gateway_ip_address_ttl==0)
                                                {
                                                        ping_ip_address_ttl=0;
                                                }
                                   	}

					socketnumber=ReduceTcp_Port;
					local_use_port=ReduceTcp_Port;
					c_net_delay=2;
				}
			//	else{return;}
			}

			temp1=rxdnet.tcpframe.tcpdata[2];

			switch(temp1)
			{
				case 0x2://确认包
					FunRecvTcpAck();
					break;
				case 0x55://要求确认包
					if(check_multi())
					{
						protect_multi();
						for(i=44;i<rxdnet.ipframe.totallength;i++)
						{
							temp=rxdnet.tcpframe.tcpdata[i-40];
							send_char(temp);
						}
						c_rxcount++;
					}

					FunSendTcpAck();
					break;
				case 0xaa:
					for(i=44;i<rxdnet.ipframe.totallength;i++)
					{
						temp=rxdnet.tcpframe.tcpdata[i-40];
						send_char(temp);
					}
					break;
				default:
					return;
			}

		}
	}
}

void FunProcessDvr(void)
{
	if(rxdnet.ipframe.sourceip[0]==dvr_ip_address.words[0])
	if(rxdnet.ipframe.sourceip[1]==dvr_ip_address.words[1])
       	{
		switch (tcp1024.state)
		{
		case tcp_state_syn_sent:
			if(rxdnet.tcpframe.control==0x12)
			{
				tcp_syn_sent();
				tcpdata_buf[0]=0x8f;//COMMAND
				tcpdata_buf[1]=0x01;

        			tcpdata_buf[2]=0x14;//TYPE
        			tcpdata_buf[3]=0x0;

        			tcpdata_buf[4]=0x04;//LENGTH
        			tcpdata_buf[5]=0x0;
        			tcpdata_buf[6]=0x0;
        			tcpdata_buf[7]=0x0;
				send_tcpdata(8);
			}
			else
			{
				c_RstTcpCount++;
				if(c_RstTcpCount>5)
				{
					c_RstTcpCount=0;
					b_RunDvrCommand=0;
					tcp1024.state=tcp_state_time_wait;
					return;
				}
				
				tcp_recievedata();
				FunRstTcp();
				
				telnet_request(dvr_ip_address.dwords,Dvr_Port);
			}

			break;
            	case tcp_state_established:
            		if(rxdnet.tcpframe.control==0x11){tcp_close(0x10);tcp1024.state=tcp_state_listen;}
            		else
            		{
            			tcp_recievedata();
            			tcpdata_buf[0]=c_camnumber-1;//CAM NUMBER
        			tcpdata_buf[1]=0x0;
        			tcpdata_buf[2]=0x0;
        			tcpdata_buf[3]=0x0;
            			send_tcpdata(4);
            			tcp1024.state=tcp_state_fin_wait1;
            		}

            		break;

            	case tcp_state_fin_wait1 :
            		tcp_recievedata();
            		tcp_sendack();
            		tcp_close(0x11);
            		tcp1024.state=tcp_state_fin_wait2;
            		break;
		case tcp_state_fin_wait2:
			if((rxdnet.tcpframe.control & 0x1)!=0)
			{
            			tcp_close(0x10);
            			tcp1024.state=tcp_state_closed;
            		}
            		
            		break;
            	case tcp_state_closed:
            		if((rxdnet.tcpframe.control & 0x1)!=0)
			{
            			tcp_close(0x10);
            			tcp_close(0x11);
            			tcp1024.state=tcp_state_time_wait;
            		}
            		
            		b_RunDvrCommand=0;

            		break;
            	default :break;
       		}
	}
}

void FunProcessNormalTcp(void)
{

}

void FunProcess_Tcp()
{
	//tcp数据包的处理过程
//	unsigned char i;

//	if(rxdnet.ipframe.destip[0]==my_ip_address.words[0])
//	if(rxdnet.ipframe.destip[1]==my_ip_address.words[1])//仅处理属于我的ip地址的数据包
//.	if(verifytcpcrc())
	{
		
		//if(b_debug)
	//	{
	//		for(i=4;i<(rxdnet.ipframe.totallength+18);i++)
	//		{
	//			send_hex(rxdnet.bytes.bytebuf[i]);
	//		}
	//	}

		switch(rxdnet.tcpframe.destport)
		{
			case ReduceTcp_Port:
				FunProcessReduceTcp();
				break;
			case Local_Dvr_Port:
				FunProcessDvr();
				break;
			case NormalTcp_Port:
				FunProcessNormalTcp();
				break;
			default:
				break;
		}
	}
}


void FunProcessUDP(void)
{
	unsigned char i;
	unsigned char packet_num=0;
	
	if((rxdnet.udpframe.udpdata[0]==0x55)&&(rxdnet.udpframe.udpdata[1]==0xaa)&&(rxdnet.udpframe.udpdata[2]==0x55))
	{
		packet_num=rxdnet.udpframe.udpdata[3];
	}
	else{return;}
	
	udp_dstport=rxdnet.udpframe.sourceport;	
//	local_use_port=udp_port;
	
	for(i=4;i<(rxdnet.udpframe.length-8);i++)
	{
		send_char(rxdnet.udpframe.udpdata[i]);
	}
	for(i=0;i<3;i++)
	{
		txdnet.etherframe.destnodeid[i]=rxdnet.etherframe.sourcenodeid[i];
	}
/*	for(i=0;i<2;i++)
	{
		ping_ip_address.words[i]=rxdnet.ipframe.sourceip[i];
	}*/
	
	txdnet.udpframe.udpdata[0]=0x55;
	txdnet.udpframe.udpdata[1]=0xaa;	
	txdnet.udpframe.udpdata[2]=0x2;
	txdnet.udpframe.udpdata[3]=packet_num;
	
	create_udp_packet(4);
}

unsigned int  createicmpcrc()
{
 	unsigned char i;
 	crctemp.dwords=0;
 	for(i=19;i<39;i++)
	{
 		crctemp.dwords=crctemp.dwords+txdnet.words.wordbuf[i];
	}
	while(crctemp.words.high>0)
	{
                crctemp.dwords=(ulong)(crctemp.words.high+crctemp.words.low);
        }
	crctemp.words.low=0xffff-crctemp.words.low;
	return(crctemp.words.low);
}

void ping_answer()
{
	uchar i;

//	if(rxdnet.icmpframe.type==0x08)
      	{
      		//表示是ping请求
       		for (i=16;i<(rxdnet.ipframe.totallength+18);i++)
           	{
        		txdnet.bytes.bytebuf[i]=rxdnet.bytes.bytebuf[i];//将数据复制到发送缓冲区
           	}
    		txdnet.etherframe.destnodeid[0]=rxdnet.etherframe.sourcenodeid[0];
    		txdnet.etherframe.destnodeid[1]=rxdnet.etherframe.sourcenodeid[1];
    		txdnet.etherframe.destnodeid[2]=rxdnet.etherframe.sourcenodeid[2];
    		txdnet.ipframe.ttl=txdnet.ipframe.ttl-1;
    		txdnet.ipframe.crc=0;
    		txdnet.ipframe.destip[0]=rxdnet.ipframe.sourceip[0];
    		txdnet.ipframe.destip[1]=rxdnet.ipframe.sourceip[1];
    		txdnet.ipframe.sourceip[0]=my_ip_address.words[0];
    		txdnet.ipframe.sourceip[1]=my_ip_address.words[1];
    		txdnet.ipframe.crc=createipheadcrc();
    		txdnet.icmpframe.type=0x00;// is icmp answer;
    		txdnet.icmpframe.crc=0;
    		//for(i=21;i<42;i++)
    		//{
    		//	txdnet.words.wordbuf[i]=rxdnet.words.wordbuf[i];
    		//}
     		txdnet.icmpframe.crc=createicmpcrc();
     	//	txdnet.etherframe.length=rxdnet.ipframe.totallength+14;
     		send_packet(rxdnet.ipframe.totallength+14);
  	}
}

void ping_echo()
{
	/*
	send_string(" Reply From IP=");
	send_word(rxdnet.ipframe.sourceip[0]);
	send_word(rxdnet.ipframe.sourceip[1]);
	send_string(" TTL=");
	send_hex(rxdnet.ipframe.ttl);*/
}

void FunProcessIP(void)
{
	switch(rxdnet.ipframe.protocal)
       	{
       		case 1://表示为icmp协议
                  	if(rxdnet.icmpframe.type==8)
                        {
                         	ping_answer();
                      	}
                        else if(rxdnet.icmpframe.type==0)
                        {
				ping_echo();
			}
			break;
       		case 6: //表示是tcp协议
                 	FunProcess_Tcp();
                      	break;
                case 17://udp
        		FunProcessUDP();
       			break;
        	default:break;
        }
}

void FunProcessRec(void)
{

	switch(rxdnet.etherframe.protocal)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -