CH395 tcp服务器 热拔插
CH395 TCP_Server模式单连接和多 连接区别:
(1)单连接即一个socket既做监听作用,又负责数据传输,对395而言,如果采用单连接模式,那么最多可以创建8个服务器(源端口需要不一样),但没有服务器只能连一个客户端,即最多可以连8个客户端
(2)多连接即选用一个socket负责监听,另选其他socket负责通信。此种模式下,可以创建几个服务器以及每个服务器可以连几个客户端取决于客户代码配置。
1.CH395,0x4A版本,TCP_Server(多连接)模式,对端为PC电脑用TCPIPDebug网络调试助手做客户端。
如创建三个服务器,其中:
socket0监听,socket1,socket2,socket3数据通信;
socket4监听,socket5数据通信;
socket6监听,socket7数据通信;
实现功能,tcp连接建立后,拔掉网线再插上,客户端可以立马连上。
代码如下,在PHY_Change中断和超时中断按照如下操作即可。(超时中断中实际不用做任何处理)
1 if(init_status & GINT_STAT_PHY_CHANGE) /* 产生PHY改变中断*/ 2 { 3 phy_sta = CH395CMDGetPHYStatus(); 4 printf("PHY:%x\r\n",phy_sta); 5 if(phy_sta == 0x01) 6 { 7 i = CH395TCPDisconnect(1); //仅需对负责数据通信的几个socket进行操作即可,负责监听的socket无需做任何动作。 8 mStopIfError(i); 9 i = CH395TCPDisconnect(2); 10 mStopIfError(i); 11 i = CH395TCPDisconnect(3); 12 mStopIfError(i); 13 i = CH395TCPDisconnect(5); 14 mStopIfError(i); 15 i = CH395TCPDisconnect(7); 16 mStopIfError(i); 17 printf("DIS\r\n"); 18 } 19 } 20 21 if(sock_int_socket & SINT_STAT_TIM_OUT) /* 超时中断 */ 22 { 23 printf("超时中断 \n"); 24 printf("tcp_timeout:%d\r\n",sockindex); 25 }
2.CH395,0x4a版本,TCP_Server(单连接)模式,对端为PC电脑用TCPIPDebug网络调试助手做客户端。
如创建五个服务器(最多可创建8个),其中:
socket0 既做监听又负责数据通信;
socket1 既做监听又负责数据通信;
socket2 既做监听又负责数据通信;
socket3 既做监听又负责数据通信;
socket4 既做监听又负责数据通信;
实现功能,tcp连接建立后,拔掉网线再插上,客户端可以立马连上。
代码如下,在PHY_Change中断和超时中断按照如下操作即可。超时中断中需要对socket重新打开和重新监听
1 if(init_status & GINT_STAT_PHY_CHANGE) /* 产生PHY改变中断*/ 2 { 3 phy_sta = CH395CMDGetPHYStatus(); 4 printf("PHY:%x\r\n",phy_sta); 5 if(phy_sta == 0x01) 6 { 7 i = CH395TCPDisconnect(0); 8 mStopIfError(i); 9 i = CH395TCPDisconnect(1); 10 mStopIfError(i); 11 i = CH395TCPDisconnect(2); 12 mStopIfError(i); 13 i = CH395TCPDisconnect(3); 14 mStopIfError(i); 15 i = CH395TCPDisconnect(4); 16 mStopIfError(i); 17 18 printf("DIS\r\n"); 19 } 20 } 21 22 if(sock_int_socket & SINT_STAT_TIM_OUT) /* 超时中断 */ 23 { 24 printf("超时中断 \n"); 25 printf("tcp_timeout:%d\r\n",sockindex); 26 i = CH395OpenSocket(sockindex); 27 mStopIfError(i); 28 i = CH395TCPListen(sockindex); 29 mStopIfError(i); 30 }
原理:在网线断开后,调用Tcp_Disconnect函数发送FIN包,等到再次插上网线后,芯片发出FIN包,对端发RST包复位掉上次连接,触发超时中断,实现对socket的关闭,到这一步,单连接模式而言,需要主动在超时中断里打开socket和开启监听功能;而对多连接模式而言,超时中断里不用做任何操作,因为负责监听的socket还处于正常监听状态,所以客户端直接发起新的连接即可和395服务器建立tcp连接。