硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3701|回复: 11
收起左侧

[RL-TCPnet] 关于KEEP_ALIVE功能的使用疑问

[复制链接]

98

主题

340

回帖

634

积分

金牌会员

积分
634
发表于 2018-8-6 22:40:56 | 显示全部楼层 |阅读模式
1.Net_config中针对于TCP有个参数TCP_DEFTOUT,描述如下“用于配置默认的保持连接时间,即我们常说的Keep Alive时间,如果时间到了将断开连接”,默认为120S。
2.例程中tcp_get_socket 函数有个参数是tout,描述是“断开连接前的空闲溢出时间”,“客户端连接服务器后,10秒内无数据通信将断开连接
3.对于功能TCP_TYPE_KEEP_ALIVE,是这样描述的“当溢出时间到,TCP Socket会自动发送一个keep-alive数据包来保持连接”。
以上三者之间是什么关系?感觉TCP_DEFTOUT和tout功能一样啊。

于是进行了以下测试,采用以下方式创建一个TCP服务器
        socket_tcp = tcp_get_socket (TCP_TYPE_SERVER, 0, 10, tcp_callback);
预想的情况是不是10秒内无通信,TCP将断开连接?
用网络调试助手实测发现,TCP连接建立后至始至终都保持着连接状态,哪怕超过了120S,调用tcp_get_state发现socket始终处于TCP_STATE_CONNECT状态,这是什么原因呢?
于是再次做以下测试,TCP建立后拔掉网线,网络调试助手连接状态不变,保持120S以上,再次插上网线TCP仍然可以正常收发数据,似乎那个“断开连接”没起作用啊。

       监测网线断开的目的也是为了监测TCP连接情况,因为PYH只能检测到本地网线的断开,通过交换机连接的对端客户端网线断开是监测不到的,所以想统一用keep-alive数据包功能监测TCP连接状态。
设备上另外一个网口用的W5500做的,它也有KEEP_ALIVE这个功能,如果在TCP连接状态下拔掉网线,那么等待超时后TCP状态会自动由连接状态(SOCK_ESTABLISHED)恢复到监听状态(SOCK_LISTEN)。
原曾想RL-tcpnet会不会和W5500一样的机理,但多种情况测试发现,RL-tcpnet在网线拔掉情况下,TCP状态不会自己发生改变,但有一种情况除外,建立TCP连接之后,拔掉网线,网络调试助手也断开,这时候再次插上网线,Socket状态会由之前的连接状态重新切换到监听状态,但是如果长时间拔掉网线后再插上,则会一直保持之前的连接状态,不解这是为何?
      总之RL-tcpnet这KEEP_ALIVE功能到底如何使用,搞迷糊了,麻烦硬汉哥指点一下。



回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107122
QQ
发表于 2018-8-7 01:12:54 | 显示全部楼层
999.png
回复

使用道具 举报

98

主题

340

回帖

634

积分

金牌会员

积分
634
 楼主| 发表于 2018-8-7 09:15:51 | 显示全部楼层
难道是我用的网络调试助手会自动重连?但是如果自动重连串口应该也会打印信息啊!回去我再用你的网络调试助手测试一下。
回复

使用道具 举报

98

主题

340

回帖

634

积分

金牌会员

积分
634
 楼主| 发表于 2018-8-7 19:06:03 | 显示全部楼层

测试任务如下

void TCPnetTest(void)
{  
        int32_t iCount;
        uint8_t *sendbuf;
        uint8_t tcp_status;
        uint16_t maxlen;
        uint8_t res;
        OS_ERR       err;
        CPU_TS             ts;
        OS_FLAGS     xResult;
        /*
           创建TCP Socket并创建监听,客户端连接服务器后,10秒内无数据通信将断开连接。
           但是由于这里使能了TCP_TYPE_KEEP_ALIVE,会一直保持连接,不受10秒的时间限制。
        */
   // socket_tcp = tcp_get_socket (TCP_TYPE_SERVER|TCP_TYPE_KEEP_ALIVE, 0, 10, tcp_callback);
                socket_tcp = tcp_get_socket (TCP_TYPE_SERVER, 0, 10, tcp_callback);
        if(socket_tcp != 0)
        {
                res = tcp_listen (socket_tcp, PORT_NUM);
                printf_debug("tcp listen res = %d\r\n", res);
        }
       
        while (1)
        {
                /* RL-TCPnet处理函数 */
                main_TcpNet();
               
                /* 用于网线插拔的处理 */
                tcp_status = TCP_StatusCheck();
               
        }
}
串口打印信息如下
tcp listen res = 1

IP:远程客户端
肭罅?覫P: 192.168.1.20  port:55129
Socket is connected
to remote peer

还是没有等待期待的“Connection has
been closed”

代码没问吧,我用的是LAN8720,目前没有加轮训断线检测,跟这个没关系吧

回复

使用道具 举报

98

主题

340

回帖

634

积分

金牌会员

积分
634
 楼主| 发表于 2018-8-7 19:08:09 | 显示全部楼层
调试助手页面如下
串口.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107122
QQ
发表于 2018-8-7 19:12:08 | 显示全部楼层
云琴箫龙 发表于 2018-8-7 19:08
调试助手页面如下

使用我的那个网络助手就解决了,你的这个好像功能有点弱。
回复

使用道具 举报

98

主题

340

回帖

634

积分

金牌会员

积分
634
 楼主| 发表于 2018-8-7 20:09:51 | 显示全部楼层
换成你那个网络调试助手也一样,真是奇怪了啊!
异常.png
回复

使用道具 举报

98

主题

340

回帖

634

积分

金牌会员

积分
634
 楼主| 发表于 2018-8-7 20:11:01 | 显示全部楼层
拔掉网线隔半分钟再插上还能正常收发数据
回复

使用道具 举报

98

主题

340

回帖

634

积分

金牌会员

积分
634
 楼主| 发表于 2018-8-7 20:17:32 | 显示全部楼层
在回调函数中打了断点,发现TCP连接之后如果没有数据发送就不会进回调函数
回复

使用道具 举报

98

主题

340

回帖

634

积分

金牌会员

积分
634
 楼主| 发表于 2018-8-7 20:32:08 | 显示全部楼层
找到问题了,是调用timer_tick ()的任务出了问题,导致函数timer_tick ()根本没有被调用到,协议栈的时间基准没了.......哎!说多了都是泪,找地儿哭会儿去。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107122
QQ
发表于 2018-8-8 00:24:33 | 显示全部楼层
云琴箫龙 发表于 2018-8-7 20:32
找到问题了,是调用timer_tick ()的任务出了问题,导致函数timer_tick ()根本没有被调用到,协议栈的时间基 ...

回复

使用道具 举报

36

主题

1446

回帖

1554

积分

至尊会员

积分
1554
发表于 2019-3-18 18:05:46 | 显示全部楼层
记录TCP保活以及接收超时

设置保活属性

设置保活属性

非保活情况下,断开连接的时间

非保活情况下,断开连接的时间

阻塞接收超时

阻塞接收超时

阻塞接收超时时间

阻塞接收超时时间
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-18 16:34 , Processed in 0.218602 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表