CH392T/F TCP 热拔插

1.CH392T、0x18版本、TCP_Server模式,对端为PC电脑用TCPIPDebug网络调试助手做客户端。

创建三个服务器,其中:
socket0监听,socket1数据通信;
socket2监听,socket3数据通信;
socket4监听,socket5数据通信;

实现功能,tcp连接建立后,拔掉网线再插上,客户端可以立马连上

 1     if (init_status & GINT_STAT_PHY_CHANGE) /* PHY change interrupt */
 2     {
 3        printf("PHY_Change!\r\n");
 4         phy_sta =  CH392CMDGetPHYStatus();
 5         if(phy_sta == 0x01)
 6         {
 7             i = CH392CMDTCPDisconnect(1);     //socket0,2,4做监听,socket1,3,5做数据通信
 8             mStopIfError(i);                  //检测到网线断开,调用TCPDisconnect或CloseSocket函数断开此次链接
 9             i = CH392CMDTCPDisconnect(3);     //不用对负责监听的socket做操作
10             mStopIfError(i);
11             i = CH392CMDTCPDisconnect(5);
12             mStopIfError(i);
13             printf("PHY_DIS\r\n");
14         }
15     }

在PHY_Change中断中,查询PHY的状态,当检测到PHY为断开状态,调用Close_Socket函数关闭负责数据通信的socket(:此处的close函数均可换成Tcp_Disconnect函数,效果一致)。断开中断和超时中断不用做任何操作(仅对于tcp服务器模式而言)。

2.CH392T、0x18版本、TCP_Clent模式,对端为PC电脑用TCPIPDebug网络调试助手做服务器。

socket6做tcp客户端,连接服务器。

实现功能,tcp连接建立后,拔掉网线再插上392T可以立马连上服务器。

 1     if (init_status & GINT_STAT_PHY_CHANGE) /* PHY change interrupt */
 2     {
 3        printf("PHY_Change!\r\n");
 4         phy_sta =  CH392CMDGetPHYStatus();
 5         if(phy_sta == 0x01)
 6         {
 7             i = CH392CMDTCPDisconnect(6);
 8             mStopIfError(i);
 9             printf("PHY_DIS\r\n");
10         }
11     }
1     if (sock_int_socket & SINT_STAT_TIM_OUT) /* Timeout interrupt, valid only in TCP mode */
2     {
3         printf("SINT_STAT_TIM_OUT\r\n");
4         i = CH392CMDOpenSocket(sockindex);                       /* open socket 0 */
5         mStopIfError(i);                                 /* check the result */
6         i = CH392CMDTCPConnect(sockindex);
7         mStopIfError(i);
8 
9     }

:PHY_Change中断中必须使用CH392CMDTCPDisconnect函数,不可用CH392CMDCloseSocket函数。

3.CH392F、0x26版本、TCP_Client模式,对端为PC电脑用TCPIPDebug网络调试助手做服务器。

 1     if (init_status & GINT_STAT_PHY_CHANGE) /* PHY change interrupt */
 2     {
 3        printf("PHY_Change!\r\n");
 4         phy_sta =  CH392CMDGetPHYStatus();
 5         if(phy_sta == 0x01)
 6         {
 7 //         i = CH392CMDCloseSocket(0);
 8            i = CH392CMDTCPDisconnect(0);//CH392CMDTCPDisconnect和CH392CMDCloseSocket二选一
 9            mStopIfError(i);
10            printf("PHY_DIS\r\n");
11         }
12     }
1     if (sock_int_socket & SINT_STAT_TIM_OUT) /* Timeout interrupt, valid only in TCP mode */
2     {
3         printf("SINT_STAT_TIM_OUT\r\n");
4         i = CH392CMDOpenSocket(sockindex);                       /* open socket 0 */
5         mStopIfError(i);                                 /* check the result */
6         i = CH392CMDTCPConnect(sockindex);
7         mStopIfError(i);
8 
9     }

4.CH392F、0x26版本、TCP_Server模式,对端为PC电脑用TCPIPDebug网络调试助手做客户端。

创建二个服务器,其中:(CH392F共4个socket,至多可建立两个服务器)
socket0监听,socket1数据通信;
socket2监听,socket3数据通信;

 1     if (init_status & GINT_STAT_PHY_CHANGE) /* PHY change interrupt */
 2     {
 3         printf("PHY_Change!\r\n");
 4         phy_sta =  CH392CMDGetPHYStatus();
 5         if(phy_sta == 0x01)
 6         {
 7             i = CH392CMDTCPDisconnect(1);     //socket0,2做监听,socket1,3做数据通信
 8             mStopIfError(i);                  //检测到网线断开,调用TCPDisconnect或CloseSocket函数断开此次链接
 9             i = CH392CMDTCPDisconnect(3);     //不用对负责监听的socket做操作
10             mStopIfError(i);
11 //            i = CH392CMDCloseSocket(1);
12 //            mStopIfError(i);
13 //            i = CH392CMDCloseSocket(3);
14 //            mStopIfError(i);
15             printf("PHY_DIS\r\n");
16         }
17     }

断开中断和超时中断不用做任何操作(仅对于tcp服务器模式而言)

原理:无论是tcp服务器还是tcp客户端,都是在网线断开后,调用Tcp_Disconnect函数发送FIN包,等到再次插上网线后,芯片发出FIN包,对端发RST包复位掉上次连接,触发超时中断,实现对socket的关闭,到这一步,对tcp客户端而言,需要主动在超时中断里打开socket和发起tcp连接;而对tcp服务器而言,超时中断里不用做任何操作,因为负责监听的socket还处于正常监听状态,所以客户端直接发起新的连接即可和392服务器建立tcp连接。

posted on 2024-11-22 10:13  Lqqq123  阅读(7)  评论(0编辑  收藏  举报

导航