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连接。