📄 tcp.lst
字号:
C51 COMPILER V7.06 TCP 12/07/2004 08:46:35 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE TCP
OBJECT MODULE PLACED IN tcp.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE tcp.c DEBUG OBJECTEXTEND
stmt level source
1 /*********************************************************************
2 *文件名称: tcp.c
3 *文件标识:
4 *摘 要: 在事件的驱动下,按照状态转移图进行TCP协议的处理
5 *
6 *********************************************************************/
7 #define TCP_GLOBALS
8 #include "net_cfg.h"
9
10 /*****************************************************************
11 **函数原型: void TCP1024_Init()
12 **入口参数: 无
13 **出口参数: 无
14 **返 回 值: 无
15 **功能说明: 初始化任务控制块,使本地机进入listen状态并清空重发缓冲区
16 ******************************************************************/
17 void TCP1024_Init()
18 {
19 1 TCP1024.State=0;
20 1 TCP1024.My_Port=MY_TCP_PORT;
21 1 TCP1024.Send_Next=0x0000;
22 1 Resend_Buff.EtherFrame.RecStatus=0;//表示该重发缓冲区没有数据
23 1
24 1 }
25
26 //==============================================================
27 /**********************************************************************
28 **函数原型: void Send_Reset()
29 **入口参数: 无
30 **出口参数: 无
31 **返 回 值: 无
32 **功能说明: 发送TCP_RST数据报文,复位对方连接
33 ******************************************************************/
34 void Send_Reset()
35 {
36 1 uchar i;
37 1 for(i=0;i<3;i++)
38 1 {
39 2 TxdNetBuff.EtherFrame.DestMacId[i]=RxdNetBuff.EtherFrame.SourceMacId[i];//目的网卡地址
40 2 }
41 1 TxdNetBuff.EtherFrame.NextProtocal=0x0800;//协议为ip协议
42 1 TxdNetBuff.TcpFrame.SourcePort=RxdNetBuff.TcpFrame.DestPort;
43 1 TxdNetBuff.TcpFrame.DestPort=RxdNetBuff.TcpFrame.SourcePort;
44 1 TxdNetBuff.TcpFrame.offset=0x50;
45 1 TxdNetBuff.TcpFrame.window=0;
46 1 TxdNetBuff.TcpFrame.urg=0;
47 1 TxdNetBuff.TcpFrame.Crc=0;
48 1 TxdNetBuff.IpFrame.DestId[0]=RxdNetBuff.IpFrame.SourceIp[0];
49 1 TxdNetBuff.IpFrame.DestId[1]=RxdNetBuff.IpFrame.SourceIp[1];
50 1 TxdNetBuff.IpFrame.SourceIp[0]=My_Ip_Address.words[0];
51 1 TxdNetBuff.IpFrame.SourceIp[1]=My_Ip_Address.words[1];
52 1 TxdNetBuff.IpFrame.ttl=0;
53 1 TxdNetBuff.IpFrame.NextProtocal=6;//tcp
54 1 TxdNetBuff.IpFrame.Crc=20;
55 1 TxdNetBuff.TcpFrame.Crc=CreateTcpCrc();
C51 COMPILER V7.06 TCP 12/07/2004 08:46:35 PAGE 2
56 1 Create_Ip_Frame(20,RxdNetBuff.IpFrame.SourceIp[0],RxdNetBuff.IpFrame.SourceIp[1],6);
57 1 }
58
59 /**********************************************************************
60 **函数原型: void Tcp_Listen( )
61 **入口参数: 无
62 **出口参数: 无
63 **返 回 值: 无
64 **功能说明: 本地机进入listen状态,可以对TCP_SYN或TCP_FIN请求进行处理
65 ******************************************************************/
66 void Tcp_Listen()
67 {
68 1 uchar i;
69 1 /*if(RxdNetBuff.TcpFrame.control&(TCP_FIN))//reset
70 1 {Send_Reset();} //对方不接受请求,
71 1 else*/
72 1 if(RxdNetBuff.TcpFrame.control&TCP_SYN)//表示这是一个请求连接
73 1 {
74 2 for(i=0;i<2;i++) //对方的ip地址
75 2 {TCP1024.Dest_Ip[i]=RxdNetBuff.IpFrame.SourceIp[i];}
76 2 for(i=0;i<3;i++) //对方的以太网地址或网关地址
77 2 {TCP1024.Dest_Mac_Id[i]=RxdNetBuff.EtherFrame.SourceMacId[i];}
78 2 TCP1024.My_Port=MY_TCP_PORT; //本机端口
79 2 TCP1024.Dest_Port=RxdNetBuff.TcpFrame.SourcePort;//对方端口
80 2 TCP1024.IRS=RxdNetBuff.TcpFrame.SeqNum; //对方的初始化顺序号
81 2 TCP1024.Rcv_Next=RxdNetBuff.TcpFrame.SeqNum+1; //对方的顺序号,用于确认
82 2 TCP1024.ISS=TCP1024.Send_Next; //我的初始化顺序号
83 2 TCP1024.Sent_UnAck=TCP1024.ISS; //我的未确认得序号
84 2 TCP1024.Send_Next=TCP1024.ISS+1; //我的顺序号,用于发送
85 2 TCP1024.My_Wl1=RxdNetBuff.TcpFrame.SeqNum; //seq
86 2 TCP1024.My_Wl2=TCP1024.Send_Next; //
87 2 TCP1024.Rcv_Window=RxdNetBuff.TcpFrame.window; //对方的WINDOW大小
88 2 TCP1024.Snd_Window=1024; //通知对方本地最大接收1024字节的包,用于流控
89 2 TCP1024.Dest_Max_Seg_Size=560; //默认为560
90 2 if(RxdNetBuff.TcpFrame.offset>20)
91 2 if(RxdNetBuff.TcpFrame.tcpdata[0]==0x02)
92 2 if(RxdNetBuff.TcpFrame.tcpdata[1]==0x04) //0204为最大segment选项
93 2 {
94 3 TCP1024.Dest_Max_Seg_Size=RxdNetBuff.TcpFrame.tcpdata[2]*256+RxdNetBuff.TcpFrame.tcpdata[3];
95 3 }
96 2 TCP1024.My_Max_Seg_Size=1460;//本地机可以接受最大的以太网数据包
97 2 //===========以下建立应答帧
98 2 for(i=0;i<3;i++)//目的网卡地址
99 2 {TxdNetBuff.EtherFrame.DestMacId[i]=TCP1024.Dest_Mac_Id[i];}
100 2 TxdNetBuff.EtherFrame.NextProtocal=0x0800;//协议为ip协议
101 2 TxdNetBuff.TcpFrame.SourcePort=TCP1024.My_Port;
102 2 TxdNetBuff.TcpFrame.DestPort=TCP1024.Dest_Port;
103 2 TxdNetBuff.TcpFrame.SeqNum=TCP1024.ISS;
104 2 TxdNetBuff.TcpFrame.AckNum=TCP1024.Rcv_Next;
105 2
106 2 TxdNetBuff.TcpFrame.offset=0x70;
107 2 TxdNetBuff.TcpFrame.control=0x12; //syn+ack
108 2 TxdNetBuff.TcpFrame.window=TCP1024.Snd_Window;
109 2 TxdNetBuff.TcpFrame.urg=0;
110 2 TxdNetBuff.TcpFrame.Crc=0;
111 2 TxdNetBuff.IpPacket.IpPacket[20]=0x0204;//tcp选项
112 2 TxdNetBuff.IpPacket.IpPacket[21]=TCP1024.My_Max_Seg_Size;
113 2 TxdNetBuff.IpPacket.IpPacket[22]=0x0101;
114 2 TxdNetBuff.IpPacket.IpPacket[23]=0x0101;
115 2 TxdNetBuff.IpFrame.DestId[0]=TCP1024.Dest_Ip[0];
116 2 TxdNetBuff.IpFrame.DestId[1]=TCP1024.Dest_Ip[1];
117 2 TxdNetBuff.IpFrame.SourceIp[0]=My_Ip_Address.words[0];
C51 COMPILER V7.06 TCP 12/07/2004 08:46:35 PAGE 3
118 2 TxdNetBuff.IpFrame.SourceIp[1]=My_Ip_Address.words[1];
119 2 TxdNetBuff.IpFrame.ttl=0;
120 2 TxdNetBuff.IpFrame.NextProtocal=6;//tcp
121 2 TxdNetBuff.IpFrame.Crc=28;
122 2 TxdNetBuff.TcpFrame.Crc=CreateTcpCrc();
123 2 Create_Ip_Frame(28,TCP1024.Dest_Ip[0],TCP1024.Dest_Ip[1],6);
124 2 TCP1024.State=TCP_STATE_SYN_RCVD;//Tcp_SYN_Rec;
125 2 }
126 1 else if(RxdNetBuff.TcpFrame.control&TCP_RST)
127 1 {;}
128 1 else
129 1 {Send_Reset();}
130 1 }
131 /**********************************************************************
132 **函数原型: void Delete_Socket()
133 **入口参数: 无
134 **出口参数: 无
135 **返 回 值: 无
136 **功能说明: 撤销本地连接,并清空重发缓冲区
137 ******************************************************************/
138 void Delete_Socket()
139 {
140 1 TcpConnected=0;
141 1 TCP1024.State=0;
142 1 TCP1024.ISS=TCP1024.ISS+10;//
143 1 Resend_Buff.EtherFrame.RecStatus=0;//表示该重发缓冲区没有数据
144 1 Printf_String("Disconnect!\r\n");
145 1 }
146 /**********************************************************************
147 **函数原型: void Resend_Packet( )
148 **入口参数: uchar i
149 **出口参数: 无
150 **返 回 值: 无
151 **功能说明: 重发出错的数据包
152 ******************************************************************/
153 void Resend_Packet()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -