📄 protocol.c
字号:
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 + -