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