首页 > 其他分享 >CH395 tcp客户端 热拔插

CH395 tcp客户端 热拔插

时间:2024-09-26 09:34:26浏览次数:1  
标签:socket 中断 CH395 sock tcp 热拔 网线 超时

CH395做tcp客户端,实现网线拔掉后tcp断开,网线插上后tcp连接。

目前提供三种思路:

芯片测试版本:0x49,测试工具:TCPIPDebug做服务器

1.第一种思路

(1)代码:(在CH395的tcp_client例程的超时终端和PHY_Change中断中加上下面的代码即可)

 1 u8 sock_sta[2];
 2 u8 i ;
 3 if(init_status & GINT_STAT_PHY_CHANGE)                      /* 产生PHY改变中断*/
 4 {
 5     CH395CMDGetSocketStatus(0,sock_sta);                   /*查询socket状态*/
 6     printf("SOCK-sta:%x %x\r\n",sock_sta[0],sock_sta[1]);
 7     
 8     if(sock_sta[0] == 0x05 && sock_sta[1] == 0x04)       /*socket已打开且tcp已建立*/
 9     {
10         i = CH395CloseSocket(0);
11         mStopIfError(i);
12     }
13 }
14 
15 
16 if(sock_int_socket & SINT_STAT_TIM_OUT)                           /* 超时中断 */
17 {
18     printf("超时中断 \n");
19     i = CH395OpenSocket(sockindex);        /* 打开socket 0 */
20     mStopIfError(i);               /* 检查是否成功 */
21     i = CH395TCPConnect(sockindex);
22     mStopIfError(i);
23 }

 

(2)原理:

①拔插网线都会产生相同的PHY_Change中断,如何判断此时是拔网线的动作还是插网线的动作?在tcp模式下,可以通过查socket状态来区别(当然也可以直接通过查询phy的协商状态来判断),如上程序,当网线插上时,由于是tcp客户端模式,所以395会发送SYN握手,此时socket的状态为SYN发送态(上述代码没写,这个不需要),当tcp建立完成后,socket的状态改为TCP连接建立态;当tcp建立成功后,此时我们拔掉网线,进入phy_change中断,查到socket的状态为连接态,执行关闭socket的函数。(PS:关于tcp的连接状态参考手册5.22章节)

②由于执行了关闭socket的函数,所以395会发送FIN挥手包以此希望断开此次tcp连接,但是由于此时网线被拔掉,导致FIN包不能正常发包。因此,此时如果我们插上网线,可以看到395会立马发出之前想要发但没能发出去的FIN包,此时服务端并不会执行正常的挥手,而是直接发送RST包复位到之前的tcp连接,之后395检测到tcp断开异常,因此会产生超时中断,我们在超时中断中重新打开socket和执行tcp连接函数即可实现功能。

注:抓包如下,192.168.1.112是395的ip,192.168.1.100是PC服务器的ip

 

2.第二种思路,不采用超时中断的方式,全在放在phy_change中断中处理。但由于395的机制,一旦进入超时中断或断开中断,都会默认关闭该socket,所以为了以防意外情况导致tcp连接断掉,一般都建议在这两个中断里加上打开socket的操作以保证异常发生后还能继续实现tcp通信,所以第二种方式不做推荐,在此就不多赘述。

 

3.第三种思路,借助keeplive功能实现。代码如下,根据手册要求,tcp客户端模式下需要在tcp连接成功后开启此功能,keeplive的空闲时间为5秒、超时时间为3秒和重试次数为200(参考手册5.56~5.59章节)

 1     if(sock_int_socket & SINT_STAT_CONNECT)                          /* 连接中断,仅在TCP模式下有效*/
 2     {
 3         printf("连接中断 \n");
 4         CH395SetKeepLive(sockindex,1);                                 /*打开KEEPALIVE保活定时器*/
 5     }
 6 
 7 
 8    if(sock_int_socket & SINT_STAT_TIM_OUT)                           /* 超时中断 */
 9    {
10         printf("超时中断 \n");
11         i = CH395OpenSocket(sockindex);                                          /* 打开socket 0 */
12         mStopIfError(i);/* 检查是否成功 */
13         i = CH395TCPConnect(sockindex);
14         mStopIfError(i);
15    }

原理:

tcp连接建立成功后,由于实际应用中,可能并不是时时刻刻都有数据传输,此时一般会开启keeplive功能来实现保活。如下,tcp连接建立后,当20ms无数据传输时,395会发送keep-alive包,服务器收到会回复相应的ack包。

 

此时拔掉网线,当网线再次插上,395会尝试发送keeplive包,此时服务器会直接将将连接RST掉,导致进入超时中断,从而重新打开open和建立tcp连接

 

总结:推荐第一种方式,如有更好的方法可以评论交流

标签:socket,中断,CH395,sock,tcp,热拔,网线,超时
From: https://www.cnblogs.com/wchwchlq/p/18419852

相关文章

  • TCP网络编程概述超详解
    文章目录TCP网络编程概述1.TCP协议的特点2.TCP与UDP的差异3.TCP编程流程TCP网络编程相关函数详解1.`socket()`:创建套接字参数说明:返回值:示例:2.`connect()`:客户端连接服务器参数说明:返回值:示例:3.`bind()`:服务器绑定地址和端口参数说明:返回值:示例:4.`listen()`:监......
  • 阿里云ecs使用nginx部署mqtt服务的tcp转发
    一、什么是MQTT?MQTT(MessageQueuingTelemetryTransport)是一种轻量级、基于发布-订阅模式的消息传输协议,适用于资源受限的设备和低带宽、高延迟或不稳定的网络环境。它在物联网应用中广受欢迎,能够实现传感器、执行器和其它设备之间的高效通信。二、为什么MQTT是适用于物联网的最......
  • 揭秘 ARMxy 嵌入式控制器的 ModbusTCP 通信协议实战案例
    引言随着工业4.0概念的普及,越来越多的企业开始寻求将传统设备与现代信息技术相融合的方法,以提升生产效率和管理水平。在这个过程中,ModbusTCP作为一种成熟的工业通信协议,因其简单易用、兼容性好而在工业自动化领域得到广泛应用。与此同时,Node-Red作为一种开放源码的可视化编程工具,......
  • 简测网络端口小工具Tcping
    简介:使用该工具可以快速的测试端口网络连通情况1.下载Tcping.exe应用程序网站:tcping.exe-pingoveratcpconnection(elifulkerson.com)2.全局适用将下载好的Tcping.exe应用程序,移动到C:\Windows\System32文件夹下3.CMD窗口测试网络口段连通情况win+R:打开运行对话......
  • TCP协议三次握手的个人理解
    TCP协议的核心是可靠的数据传输,而保证传输是可靠的那就要求客户端和服务端双方都具备正常的收发功能。基于此,第一次握手的时候,当服务端接收到这个SYN请求时,表明客户端要进行TCP连接,同步序列号seq=x,那么从服务端的角度来看:1、客户端的发送能力是正常的;服务端接收到请求后,那么也......
  • 带你0到1之QT编程:十八、最简单之TCP协议工作原理及实战编程
    此为QT编程的第十八谈!关注我,带你快速学习QT编程的学习路线!每一篇的技术点都是很很重要!很重要!很重要!但不冗余!我们通常采取总-分-总和生活化的讲解方式来阐述一个知识点!码农不易,各位学者学到东西请点赞支持支持!开始部分:总:此次实战主要是实现一个客户端,一个服务端,来了解TC......
  • tcpdump 实践
    [root@192~]#yum-yinstalltcpdumpsocat[root@192~]#socat-uUDP-LISTEN:9999,fork-开放一个udp的服务端,持续监听[root@192~]#echo"Hello,UDPServer"|socat-UDP:192.168.100.132:9999再开一个终端发送udp请求[root@192~]#socat-uUDP-LISTEN:9999,f......
  • JAVA网络编程【基于TCP和UDP协议】超详细!!!
    ip地址:唯一标识主机的地址端口号:用于标识计算机上某个特定的网络程序InetAddress类方法说明InetAddressInetAddress.getLocalHost()静态方法,获取本机InetAddress对象(主机名+ip地址)InetAddressInetAddress.getByName("主机名")根据主机名或者域名获取ip地址对象(主机名+ip地址......
  • 网络高级day01(Modbus 通信协议:Modbus TCP)
    目录1》modbus分类1>ModbusRTU2>ModbusASCLL3>ModbusTCP 2》ModbusTCP的特点 3》ModbusTCP协议 1>报文头(一共7个字节) 2>寄存器3>功能码 4>数据 01H 功能码分析 05H功能码分析0FH功能码分析1》modbus分类1>ModbusRTU运行在串口上......
  • 基于TCP的网络编程
    @[toc]使用基于TCP的网络编程方法,完成远程计算等差数列的前n项和功能。(1)客户端将一等差数列的首项a1,公差d和项数n发送给服务器;(2)服务器端接收到数据后对接收到的数据进行解析,将前n项和的计算结果发送给客户端;(3)客户端收到后输出到控制台。要求上传源代码和服务器端和客户端的程序......