📄 tcp.c
字号:
StrConnection_buf[nr].ucBakSERIESNUM = StrConnection_buf[nr].ucSERIESNUM; //建立连接后,保存系列号
StrConnection_buf[nr].ucBakTRUECODE = StrConnection_buf[nr].ucTRUECODE;
StrConnection_buf[nr].state = STATE_ESTABLISHED; //代表一个打开的连接,数据可以传送给用户
LinkFlag = TCP;
break;
case FLG_RST | FLG_SYN: //收到重置同步位
StrConnection_buf[nr].ucTRUECODE += 1; //确认号等于序列号
StrConnection_buf[nr].ucSERIESNUM = strTcp.ucTRUECODE; //序列号等确认号
tcp_ReBack(FLG_RST | FLG_ACK, 20, nr); //回复确认后,
StrConnection_buf[nr].state = STATE_SYN_RECEIVED; //等待收到确认位
break;
case FLG_ACK: //发送数据后,等待请求回复
StrConnection_buf[nr].ucBakSERIESNUM = StrConnection_buf[nr].ucSERIESNUM; //建立连接后,保存系列号
StrConnection_buf[nr].ucBakTRUECODE = StrConnection_buf[nr].ucTRUECODE;
StrConnection_buf[nr].state = STATE_ESTABLISHED; //代表一个打开的连接,数据可以传送给用户
LinkFlag = TCP;
default:
break;
}
break;
case STATE_ESTABLISHED: //代表一个打开的连接,数据可以传送给用户
switch(TcpFlag)
{
case FLG_ACK: //收到确认位
if(StrConnection_buf[nr].HttpFlag == TCP_HTTP) //发果是发送了HTTP数据后,发送一个停止位
{
tcp_ReBack(FLG_FIN | FLG_ACK, 20, nr); //发出确认后,同进也发出自己的自已的断开的确信号
StrConnection_buf[nr].state = STATE_CLOSE_WAIT; //在连接的状态下停止
StrConnection_buf[nr].HttpFlag = TCP_END;
}
break;
case FLG_RST: //传输过程中失败后有重置位产生
StrConnection_buf[nr].ucTRUECODE += 1; //序列号加1
tcp_ReBack(FLG_SYN | FLG_RST, 20, nr); //发送一个重置和同步位
StrConnection_buf[nr].state = STATE_SYN_RECEIVED; //在收到和发送一个连接请求后等待对连接请求的确认
break;
case FLG_ACK | FLG_PSH: //收到数据
if(StrConnection_buf[nr].ucBakSERIESNUM == strTcp.ucTRUECODE) //收到确认号与序列号都相等才表示成功
{
if(FALSE == gbHaveFragment) // 没有分片的数据
{
pucTCPData = &gstaRevEthernet.ucaPacket[header_len + 20]; //表示TCP的包头长度
}
else
{
pucTCPData = &gucaSegTemp[header_len + 20]; //表示TCP的包头长度
}
if(StrConnection_buf[nr].ucBakTRUECODE == strTcp.ucSERIESNUM) //如果确认号是新的确认号
{
StrConnection_buf[nr].ucTRUECODE = strTcp.ucSERIESNUM + data_len; //回复的确认号要加上数据长度
StrConnection_buf[nr].ucBakTRUECODE = StrConnection_buf[nr].ucTRUECODE;
SerialSendbuf(pucTCPData,data_len); //发送给串口
tcp_ReBack(FLG_ACK, 20, nr); //回复确认收到数据
}
else
{
StrConnection_buf[nr].ucTRUECODE = StrConnection_buf[nr].ucBakTRUECODE;
tcp_ReBack(FLG_ACK, 20, nr); //回复确认收到数据
}
}
break;
case FLG_ACK | FLG_FIN: //收到结束位
StrConnection_buf[nr].ucTRUECODE += 1; //确认号等于序列号
tcp_ReBack(FLG_ACK, 20, nr); //回复结束的确认位
tcp_ReBack(FLG_FIN | FLG_ACK, 20, nr); //发出确认后,同进也发出自己的自已的断开的确信号
StrConnection_buf[nr].state = STATE_CLOSE_WAIT; //等待从本地用户发来的连接中断请求
break;
case FLG_ACK | FLG_RST: //收到确信重置位
StrConnection_buf[nr].ucTRUECODE += 1; //确认号等于序列号
tcp_ReBack(FLG_SYN |FLG_RST, 20, nr); //回复结束的确认位
StrConnection_buf[nr].state = STATE_LAST_ACK; //等待从本地用户发来的连接中断请求
break;
case FLG_ACK | FLG_FIN | FLG_PSH: //收到结束位
if(StrConnection_buf[nr].ucBakSERIESNUM == strTcp.ucTRUECODE) //收到确认号与序列号都相等才表示成功
{
if(FALSE == gbHaveFragment) // 没有分片的数据
{
pucTCPData = &gstaRevEthernet.ucaPacket[header_len + 20]; //表示TCP的包头长度
}
else
{
pucTCPData = &gucaSegTemp[header_len + 20]; //表示TCP的包头长度
}
if(StrConnection_buf[nr].ucBakTRUECODE == strTcp.ucSERIESNUM) //如果确认号是新的确认号
{
StrConnection_buf[nr].ucTRUECODE = strTcp.ucSERIESNUM + data_len; //回复的确认号要加上数据长度
StrConnection_buf[nr].ucBakTRUECODE = StrConnection_buf[nr].ucTRUECODE;
// if(SourcePort == NetParameter.Port_Local) //如果是本地端口号,数据就从串口发出
// {
SerialSendbuf(pucTCPData,data_len); //发送给串口
tcp_ReBack(FLG_ACK, 20, nr); //回复确认收到数据
// }
// else if(SourcePort == 80) //表示HTTP的端口号,发送网页
// {
// http_server(nr, 0);
// }
}
else
{
StrConnection_buf[nr].ucTRUECODE = StrConnection_buf[nr].ucBakTRUECODE;
tcp_ReBack(FLG_ACK, 20, nr); //回复确认收到数据
}
}
else
{
StrConnection_buf[nr].ucTRUECODE += 1; //确认号等于序列号
tcp_ReBack(FLG_ACK, 20, nr); //回复结束的确认位
}
tcp_ReBack(FLG_FIN | FLG_ACK, 20, nr); //发出确认后,同进也发出自己的自已的断开的确信号
StrConnection_buf[nr].state = STATE_LAST_ACK; //等待从本地用户发来的连接中断请求
break;
default:
break;
}
break;
case STATE_CLOSE_WAIT: //等待从本地用户发来的连接中断请求
switch(TcpFlag)
{
case FLG_ACK | FLG_FIN: //收到结束位
StrConnection_buf[nr].ucTRUECODE += 1; //确认号等于序列号
tcp_ReBack(FLG_ACK, 20, nr); //回复结束的确认位
break;
default:
break;
}
StrConnection_buf[nr].state = STATE_CLOSED; //表示没有连接
StrConnection_buf[nr].ipaddr = 0; //IP地址为0
LinkFlag = UDP;
break;
case STATE_LAST_ACK:
StrConnection_buf[nr].state = STATE_CLOSED; //表示没有连接
StrConnection_buf[nr].ipaddr = 0; //IP地址为0
LinkFlag = UDP;
break;
case STATE_FIN_WAIT_1: // He may still be sending me data - should process it
StrConnection_buf[nr].ucTRUECODE += data_len;
switch(TcpFlag)
{
case FLG_ACK: //收到确认信号后。
StrConnection_buf[nr].state = STATE_CLOSED; //表示没有连接
StrConnection_buf[nr].ipaddr = 0; //IP地址为0
LinkFlag = UDP;
break;
case FLG_FIN:
StrConnection_buf[nr].ucTRUECODE++;
tcp_ReBack(FLG_ACK | FLG_FIN, 20, nr);
StrConnection_buf[nr].state = STATE_CLOSE_WAIT; //等待对方的回复
break;
case FLG_ACK | FLG_FIN:
StrConnection_buf[nr].ucTRUECODE++;
tcp_ReBack(FLG_ACK, 20, nr); //回复确认信号
StrConnection_buf[nr].state = STATE_CLOSED; //表示没有连接
StrConnection_buf[nr].ipaddr = 0; //IP地址为0
LinkFlag = UDP;
break;
default: //如果不是中断信号
StrConnection_buf[nr].ucTRUECODE++;
tcp_ReBack(FLG_ACK, 20, nr); //回复确认信号
StrConnection_buf[nr].state = STATE_FIN_WAIT_2;
break;
}
break;
case STATE_FIN_WAIT_2: // He may still be sending me data - should process it
switch(TcpFlag)
{
case FLG_RST: //传输过程中失败后有重置位产生
StrConnection_buf[nr].ucTRUECODE += 1; //序列号加1
tcp_ReBack(FLG_SYN | FLG_RST, 20, nr); //发送一个重置和同步位
StrConnection_buf[nr].state = STATE_SYN_RECEIVED; //在收到和发送一个连接请求后等待对连接请求的确认
break;
case FLG_ACK | FLG_PSH: //收到数据
if(StrConnection_buf[nr].ucBakSERIESNUM == strTcp.ucTRUECODE) //收到确认号与序列号都相等才表示成功
{
if(FALSE == gbHaveFragment) // 没有分片的数据
{
pucTCPData = &gstaRevEthernet.ucaPacket[header_len + 20]; //表示TCP的包头长度
}
else
{
pucTCPData = &gucaSegTemp[header_len + 20]; //表示TCP的包头长度
}
if(StrConnection_buf[nr].ucBakTRUECODE == strTcp.ucSERIESNUM) //如果确认号是新的确认号
{
StrConnection_buf[nr].ucTRUECODE = strTcp.ucSERIESNUM + data_len; //回复的确认号要加上数据长度
StrConnection_buf[nr].ucBakTRUECODE = StrConnection_buf[nr].ucTRUECODE;
SerialSendbuf(pucTCPData,data_len); //发送给串口
tcp_ReBack(FLG_ACK, 20, nr); //回复确认收到数据
}
else
{
StrConnection_buf[nr].ucTRUECODE = StrConnection_buf[nr].ucBakTRUECODE;
tcp_ReBack(FLG_ACK, 20, nr); //回复确认收到数据
}
}
StrConnection_buf[nr].state = STATE_ESTABLISHED; //代表一个打开的连接,数据可以传送给用户
LinkFlag = TCP;
break;
case FLG_ACK | FLG_FIN | FLG_PSH: //收到结束位
if(StrConnection_buf[nr].ucBakSERIESNUM == strTcp.ucTRUECODE) //收到确认号与序列号都相等才表示成功
{
if(FALSE == gbHaveFragment) // 没有分片的数据
{
pucTCPData = &gstaRevEthernet.ucaPacket[header_len + 20]; //表示TCP的包头长度
}
else
{
pucTCPData = &gucaSegTemp[header_len + 20]; //表示TCP的包头长度
}
if(StrConnection_buf[nr].ucBakTRUECODE == strTcp.ucSERIESNUM) //如果确认号是新的确认号
{
StrConnection_buf[nr].ucTRUECODE = strTcp.ucSERIESNUM + data_len; //回复的确认号要加上数据长度
StrConnection_buf[nr].ucBakTRUECODE = StrConnection_buf[nr].ucTRUECODE;
// if(SourcePort == NetParameter.Port_Local) //如果是本地端口号,数据就从串口发出
// {
SerialSendbuf(pucTCPData,data_len); //发送给串口
tcp_ReBack(FLG_ACK, 20, nr); //回复确认收到数据
// }
// else if(SourcePort == 80) //表示HTTP的端口号,发送网页
// {
// http_server(nr, 0);
// }
}
else
{
StrConnection_buf[nr].ucTRUECODE = StrConnection_buf[nr].ucBakTRUECODE;
tcp_ReBack(FLG_ACK, 20, nr); //回复确认收到数据
}
}
else
{
StrConnection_buf[nr].ucTRUECODE += 1; //确认号等于序列号
tcp_ReBack(FLG_ACK, 20, nr); //回复结束的确认位
}
tcp_ReBack(FLG_FIN | FLG_ACK, 20, nr); //发出确认后,同进也发出自己的自已的断开的确信号
StrConnection_buf[nr].state = STATE_LAST_ACK; //等待从本地用户发来的连接中断请求
break;
case FLG_FIN:
StrConnection_buf[nr].ucTRUECODE++;
tcp_ReBack(FLG_ACK | FLG_FIN, 20, nr);
StrConnection_buf[nr].state = STATE_CLOSE_WAIT; //等待对方的回复
break;
case FLG_ACK | FLG_FIN:
StrConnection_buf[nr].ucTRUECODE++;
tcp_ReBack(FLG_ACK, 20, nr); //回复确认信号
StrConnection_buf[nr].state = STATE_CLOSED; //表示没有连接
StrConnection_buf[nr].ipaddr = 0; //IP地址为0
LinkFlag = UDP;
break;
default:
break;
}
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -