📄 tcp.lst
字号:
154 {
155 1 uint ii;
156 1 uchar xdata *txd=&TxdNetBuff;
157 1 uchar xdata *rt;
158 1
159 1 rt=&Resend_Buff.bytes.bytebuf;
160 1 for(ii=0;ii<Resend_Buff.ResendFrame.length+4;ii++)
161 1 {
162 2 (*txd)=(*rt);
163 2 rt++;
164 2 txd++;
165 2 }
166 1 Send_Packet(&TxdNetBuff,Resend_Buff.ResendFrame.length);
167 1 Resend_Buff.ResendFrame.timeout=RtTime;
168 1 }
169
170 /**********************************************************************
171 **函数原型: void Process_Resend_Buff( )
172 **入口参数: 无
173 **出口参数: 无
174 **返 回 值: 无
175 **功能说明: 根据接收数据的序号以及超时时间对重发缓冲区的数据进行处理
176 ******************************************************************/
177 void Process_Resend_Buff()
178 {
179 1
C51 COMPILER V7.06 TCP 12/07/2004 08:46:35 PAGE 4
180 1 if(Resend_Buff.ResendFrame.timeout>0)
181 1 Resend_Buff.ResendFrame.timeout--; //数据报的重发次数减一,防止TCP死锁
182 1 if(Resend_Buff.EtherFrame.RecStatus!=0) //表示需要重发缓冲区的数据
183 1 {
184 2 if(Resend_Buff.TcpFrame.SeqNum<TCP1024.Sent_UnAck)
185 2 //下一个待发送的数据的序号应该大于TCP1024.Sent_UnAck,因为
186 2 //tcp1024.snd_una表示上一个已发送的数据字节的序号,如果
187 2 //重发缓冲区的数据对应的序号小于TCP1024.Sent_UnAck,则说明数据
188 2 //已正确发送了,重发缓冲区内的备份的数据就没有用了,因此
189 2 //这个数据包已经过期了,可以抛弃掉,将缓冲区置为无效。
190 2 {Resend_Buff.ResendFrame.RtStatus=0;}//该缓冲区无效
191 2
192 2 else if(Resend_Buff.ResendFrame.timeout==0)//超时,或重发次数到
193 2 {//如果重发缓冲区的数据包的序号大于等于未或确认的数据序号时待发送重发
194 3 Resend_Buff.ResendFrame.RtStatus++;//重发次数加一
195 3 if(Resend_Buff.ResendFrame.RtStatus==TCP_MAX_RETXD)
196 3 { //重发TCP_MAX_RETXD次都无法正确发送时,撤销本地连接
197 4 Delete_Socket();
198 4 }
199 3 else //继续重发
200 3 Resend_Packet();
201 3 }
202 2 }
203 1 }
204 /**********************************************************************
205 **函数原型: void Tcp_SYN_Sent( )
206 **入口参数: 无
207 **出口参数: 无
208 **返 回 值: 无
209 **功能说明: 本地机主动发送SYN后,即可进入本状态,该状态下,
210 ** : 可接收几种数据:tcp_rst或tcp_syn或tcp_syn+tcp_ack
211 ******************************************************************/
212 void Tcp_SYN_Sent()
213 {
214 1 unsigned char i;
215 1 if(((RxdNetBuff.TcpFrame.AckNum<=TCP1024.ISS)||(RxdNetBuff.TcpFrame.AckNum>TCP1024.Send_Next))
216 1 &&(RxdNetBuff.TcpFrame.control&TCP_ACK))
217 1 { //对方发回的确认号应是我的初始化序号加1,若比我的初始化序号小
218 2 //或大于我的下一个序号,则说明对方连接出错
219 2 if(!(RxdNetBuff.TcpFrame.control&TCP_RST))
220 2 {//对方不接受请求
221 3 TxdNetBuff.TcpFrame.SeqNum=RxdNetBuff.TcpFrame.AckNum;
222 3 TxdNetBuff.TcpFrame.AckNum=0;
223 3 TxdNetBuff.TcpFrame.control=TCP_RST;
224 3 Send_Reset();//复位对方连接
225 3 }
226 2 else//对方发来复位请求,因此撤销本地的连接
227 2 {Delete_Socket();}
228 2 }
229 1 else if(RxdNetBuff.TcpFrame.control&(TCP_SYN))
230 1 {
231 2 TCP1024.IRS=RxdNetBuff.TcpFrame.SeqNum; //对方的初始化顺序号
232 2 TCP1024.Rcv_Next=RxdNetBuff.TcpFrame.SeqNum+1; //对方的顺序号,我可以用于给对方确认
233 2 if(RxdNetBuff.TcpFrame.control&TCP_ACK)
234 2 {
235 3 TCP1024.Sent_UnAck=RxdNetBuff.TcpFrame.AckNum;//我的未或确认得序号
236 3 Process_Resend_Buff();
237 3 }
238 2 if(TCP1024.Sent_UnAck>=TCP1024.ISS)
239 2 { //表示在一个由我发起的三次连接的过程中,对方已经对我的连接请求发回了确认
240 3 TCP1024.IRS=RxdNetBuff.TcpFrame.SeqNum;
241 3 TCP1024.Rcv_Window=RxdNetBuff.TcpFrame.window; //对方的window大小,表示对方可以接收的最大数据包的大小
C51 COMPILER V7.06 TCP 12/07/2004 08:46:35 PAGE 5
242 3 TCP1024.Dest_Max_Seg_Size=560;//默认为560
243 3 if(RxdNetBuff.TcpFrame.offset>20)
244 3 if(RxdNetBuff.TcpFrame.tcpdata[0]==0x02)
245 3 if(RxdNetBuff.TcpFrame.tcpdata[1]==0x04)//0204为最大segment选项
246 3 {
247 4 TCP1024.Dest_Max_Seg_Size=RxdNetBuff.TcpFrame.tcpdata[2]*256+RxdNetBuff.TcpFrame.tcpdata[3];
248 4 }
249 3 //发送确认
250 3 //===========以下建立应答帧
251 3 for(i=0;i<3;i++)//目的网卡地址
252 3 {TxdNetBuff.EtherFrame.DestMacId[i]=TCP1024.Dest_Mac_Id[i];}
253 3 TxdNetBuff.EtherFrame.NextProtocal=0x0800;//协议为ip协议
254 3 TxdNetBuff.TcpFrame.SourcePort=TCP1024.My_Port;
255 3 TxdNetBuff.TcpFrame.DestPort=TCP1024.Dest_Port;
256 3 TxdNetBuff.TcpFrame.SeqNum=TCP1024.Send_Next;
257 3 TxdNetBuff.TcpFrame.AckNum=TCP1024.Rcv_Next;
258 3 TxdNetBuff.TcpFrame.offset=0x50;
259 3 TxdNetBuff.TcpFrame.control=TCP_ACK;
260 3 TxdNetBuff.TcpFrame.window=TCP1024.Snd_Window;
261 3 TxdNetBuff.TcpFrame.urg=0;
262 3 TxdNetBuff.TcpFrame.Crc=0;
263 3 TxdNetBuff.IpFrame.DestId[0]=TCP1024.Dest_Ip[0];
264 3 TxdNetBuff.IpFrame.DestId[1]=TCP1024.Dest_Ip[1];
265 3 TxdNetBuff.IpFrame.SourceIp[0]=My_Ip_Address.words[0];
266 3 TxdNetBuff.IpFrame.SourceIp[1]=My_Ip_Address.words[1];
267 3 TxdNetBuff.IpFrame.ttl=0;
268 3 TxdNetBuff.IpFrame.NextProtocal=6;//tcp
269 3 TxdNetBuff.IpFrame.Crc=20;
270 3 TxdNetBuff.TcpFrame.Crc=CreateTcpCrc();
271 3 Create_Ip_Frame(20,TCP1024.Dest_Ip[0],TCP1024.Dest_Ip[1],6);
272 3 TCP1024.State=TCP_STATE_ESTABLISHED;
273 3 TcpConnected=1;
274 3 Printf_String("\r\nOK,connected.\r\nC:>");
275 3 }
276 2 else
277 2 {//说明对方同时发出连接请求
278 3 TCP1024.State=TCP_STATE_SYN_RCVD;
279 3 //===========下面建立应答帧
280 3 for(i=0;i<3;i++)//目的网卡地址
281 3 {TxdNetBuff.EtherFrame.DestMacId[i]=TCP1024.Dest_Mac_Id[i];}
282 3 TxdNetBuff.EtherFrame.NextProtocal=0x0800;//以太网协议的下层协议为IP协议
283 3 TxdNetBuff.TcpFrame.SourcePort=TCP1024.My_Port;
284 3 TxdNetBuff.TcpFrame.DestPort=TCP1024.Dest_Port;
285 3 TxdNetBuff.TcpFrame.SeqNum=TCP1024.Send_Next;
286 3 TxdNetBuff.TcpFrame.AckNum=TCP1024.Rcv_Next;
287 3 TxdNetBuff.TcpFrame.offset=0x70;
288 3 TxdNetBuff.TcpFrame.control=TCP_ACK+TCP_SYN; //TCP_ACK+TCP_SYN
289 3 TxdNetBuff.TcpFrame.window=TCP1024.Snd_Window;
290 3 TxdNetBuff.TcpFrame.urg=0;
291 3 TxdNetBuff.TcpFrame.Crc=0;
292 3 TxdNetBuff.IpPacket.IpPacket[20]=0x0204;//有TCP选项
293 3 TxdNetBuff.IpPacket.IpPacket[21]=TCP1024.My_Max_Seg_Size;
294 3 TxdNetBuff.IpPacket.IpPacket[22]=0x0101;
295 3 TxdNetBuff.IpPacket.IpPacket[23]=0x0101;
296 3 TxdNetBuff.IpFrame.DestId[0]=TCP1024.Dest_Ip[0];
297 3 TxdNetBuff.IpFrame.DestId[1]=TCP1024.Dest_Ip[1];
298 3 TxdNetBuff.IpFrame.SourceIp[0]=My_Ip_Address.words[0];
299 3 TxdNetBuff.IpFrame.SourceIp[1]=My_Ip_Address.words[1];
300 3 TxdNetBuff.IpFrame.ttl=0;
301 3 TxdNetBuff.IpFrame.NextProtocal=6;
302 3 TxdNetBuff.IpFrame.Crc=28;
303 3 TxdNetBuff.TcpFrame.Crc=CreateTcpCrc();
C51 COMPILER V7.06 TCP 12/07/2004 08:46:35 PAGE 6
304 3 Create_Ip_Frame(28,TCP1024.Dest_Ip[0],TCP1024.Dest_Ip[1],6);
305 3 }
306 2 }
307 1 }
308 /**********************************************************************
309 **函数原型: void Tcp_SYN_Rec( )
310 **入口参数: 无
311 **出口参数: 无
312 **返 回 值:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -