天线|RF射频
直播中

符筹荣

7年用户 945经验值
私信 关注
[问答]

请问lwip掉线检测状态不正确该怎么办?

      STM32F107 + LWIP ,107做服务器端与电脑通讯,有一个问题搞不懂:在通讯建立后,可以正常通讯,客户端连接或断开连接,,LWIP中的tcp_PCB->state 的状态上会更新的,显示已建立连接(0x04)或关闭(0x00),但建立通讯后,拔掉网线,tcp_pcb->state 的状态一直不会更新,仍显连接状态(0x04).
     我本意是在107主动发数据之前,先检查是否已和客户端连接上再发数据,但 tcp_pcb->state 的状态不正确,不知该如何处理,大伙支个招。

回帖(3)

陈晓晨

2019-10-21 08:40:15
tcp不管是连接还是断线都需要有握手机制,连接的时候是三次握手,正常掉线的时候是四次握手,在正常情况下,关闭握手都是有关闭的一方发起的,比如我的客户端要关闭,那么客户端会发送一个请求告诉服务器"我要关闭了"(第一个握手),然后服务器收到这个请求后回应一个响应给客户端"我受到了你的关闭请求"(第二次握手),然后然后再给客户端一个请求"既然你要关闭,那我也关闭吧"(第三次握手),客户端受到了服务器发送过来的关闭请求后,返回一个响应给服务器"我收到了你的关闭请求"(第四次握手),然后客户端关闭自己这一段的连接,服务器这一侧受到了客户端的关闭响应后也关闭自己这一侧的连接,至此服务器和客户端完全断开。而异常断线(拔网线或者突然断电)时以上的过程是没有时间和条件完成的所以此时的tcp连接只是单方面的断开,即所谓的假链接,单纯的tcp协议是无法完全解决这种事情的,所以我们通常使用心跳包来消除假链接或者说异常断线的情况。
举报

王丹青

2019-10-21 08:52:39
感谢楼上详细解析,明白了!
心跳包是怎样的概念?
举报

杨帆

2019-10-21 09:05:53
心跳包是双方预先约定好的一个数据,比如服务器为了监测客户端是否在线,会定期的发送一个数据包,比如约定好5min钟发送一个0xFF代表心跳数据,同时规定客户端收到了心跳包后必须回应一个心跳回应,比如为0xFE,这些东西都是事先服务器和客户端约定好的。那么如果在通讯正常的情况下,服务器每5min发送一次0xFF后,必然会收到一次客户端发送的0xFE的响应。当某一时刻,服务器发送了0xFF后发现在超时时间内无法收到0xFE的响应,那说明什么?说明要么客户端收不到0xFF的心跳,要么客户端发送的0xFE服务器无法收到,这两种情况均是异常情况,所以此时服务器就可以判断客户端掉线了。这就是心跳机制。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分