OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 11587|回复: 5

LWIP之netconn_write()函数 数据发送一段时间后,就不往服务器发送了

[复制链接]

6

主题

40

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2012-7-26
在线时间
30 小时
发表于 2018-1-2 20:43:48 | 显示全部楼层 |阅读模式
10金钱
本帖最后由 北宸xyz 于 2018-1-2 21:04 编辑

硬件: 战舰V3板子;
软件:网络实验8 NETCONN_TCP客户端,基础上修改。

        if((tcp_client_flag & LWIP_SEND_DATA) == LWIP_SEND_DATA) //有数据要发送
        {
                printf("\r\n心跳包\r\n",i_SendCount);
                err = netconn_write(tcp_clientconn ,tcp_client_sendbuf,strlen((char*)tcp_client_sendbuf),NETCONN_COPY); //发送tcp_server_sentbuf中的数据
                if(err != ERR_OK)
                {
                        printf("发送失败\r\n");
                }
                tcp_client_flag &= ~LWIP_SEND_DATA;
        }


在其他任务中定时10秒往服务器发送一个以上数据,用作心跳包。

问题:
         在运行一段时间后,心跳包就不往服务器发送了。其他任务也都还在运行,串口信息也有打印 出来。
         在串口信息打印中,也有“心跳包”打印,没有“发送失败”打印。
         目前我也不知道是什么原因,运行时间不固定,大概五分钟到二十分钟不等,就会出现心跳包不往服务器发送。

        请教有什么办法可以解决这个问题。

        我现在有做心跳包发送次数达到10条服务器没有回复的话,就直接断开连接,然后再重新连接。但这样总不是办法。


最佳答案

查看完整内容[请看2#楼]

tcp是可靠的连接,但服务器和客户端都有相应的超时机制的,当超过一段时间服务器没有收到数据,是会断掉连接的,你只能重新连接,你不能根据是否有回复判断是客户端还是服务端问题(从你这现象看服务器可能性更大),用whireshark抓下包你才能知道是哪端的问题。你这个成立的前提是服务器实现tcp长连接,需要服务器和客户端的共同支持,如果不能控制服务器, 老老实实用: netconn_connect -> netconn_write -> netconn_close流程做 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

400

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1746
金钱
1746
注册时间
2015-6-11
在线时间
308 小时
发表于 2018-1-2 20:43:49 | 显示全部楼层
tcp是可靠的连接,但服务器和客户端都有相应的超时机制的,当超过一段时间服务器没有收到数据,是会断掉连接的,你只能重新连接,你不能根据是否有回复判断是客户端还是服务端问题(从你这现象看服务器可能性更大),用whireshark抓下包你才能知道是哪端的问题。你这个成立的前提是服务器实现tcp长连接,需要服务器和客户端的共同支持,如果不能控制服务器, 老老实实用:
netconn_connect -> netconn_write -> netconn_close流程做心跳包吧
回复

使用道具 举报

6

主题

40

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2012-7-26
在线时间
30 小时
 楼主| 发表于 2018-1-2 21:47:06 | 显示全部楼层
本帖最后由 北宸xyz 于 2018-1-2 21:48 编辑
zc123 发表于 2018-1-2 21:37
tcp是可靠的连接,但服务器和客户端都有相应的超时机制的,当超过一段时间服务器没有收到数据,是会断掉连 ...

我用的是10秒钟发一次数据,不用长连接吧!
在心跳包发送不出去的情况下,我用PC机去Ping能通客户端.
回复

使用道具 举报

3

主题

400

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1746
金钱
1746
注册时间
2015-6-11
在线时间
308 小时
发表于 2018-1-2 22:07:46 | 显示全部楼层
本帖最后由 zc123 于 2018-1-2 22:30 编辑
北宸xyz 发表于 2018-1-2 21:47
我用的是10秒钟发一次数据,不用长连接吧!
在心跳包发送不出去的情况下,我用PC机去Ping能通客户端.

你还没有理解分层和tcp连接的含义,ping是icmp协议,是网络层的,只能证明服务器和客户端的网络是通的,不代表你当前的tcp连接没有断开。你每10s发送一次能够成功返回,是建立在你通过netconn_connect建立起的一次连接长时间保持的基础上的,如果服务端主动断开了这次连接,客户端就不会有回复了,这不是需要长连接吗?所以要不然改服务器,无法改的话就用短连接做心跳包,我给个短连接的流程,你比较下就知道差别了。
长连接: netconn_connet -> netconn_write ...delay -> ..... -> netconn_write ... delay  (一般由服务器关闭连接)
短连接: netconn_connet -> netconn_write ->  netconn_close ... delay ->...... netconn_connet -> netconn_write ->  netconn_close ...delay
回复

使用道具 举报

6

主题

40

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2012-7-26
在线时间
30 小时
 楼主| 发表于 2018-1-3 00:20:00 | 显示全部楼层
zc123 发表于 2018-1-2 22:07
你还没有理解分层和tcp连接的含义,ping是icmp协议,是网络层的,只能证明服务器和客户端的网络是通的, ...

谢谢,好像明白了。
我问下服务器端能否做成长连接。
要不然我就改为短连接方式。
回复

使用道具 举报

5

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
148
金钱
148
注册时间
2016-10-17
在线时间
47 小时
发表于 2021-1-27 13:03:49 | 显示全部楼层
楼主,你好,最近调试遇到了同样的问题,请问你最后是按什么方法解决的
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-24 16:04

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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