首页 > 代码库 > 关于LWIP断开网线后重连问题(热插拔问题)

关于LWIP断开网线后重连问题(热插拔问题)

    最近在弄STM32+LWIP协议,在网络拔掉网线情况下,无法重新连接。网上找了好多方法都没有实现,着实郁闷!后来无意间看到了暂时解决这一问题的方法,虽然不是那么完美,但最算能解决问题。分享给大家。


问题:LWIP建立一个TCP服务器,收发数据也正常。但是客户端非正常断线-如客户端掉电,突然拔掉客户端的网线,然后重新连接服务器,就连接不上了。


原因:LWIP_CLOSE(),在非正常断线情况下使用不知道有什么还占着内存释放不了,没法正常释放资源。有高手知道怎么释放,可以指点一下。


我的方法是:使用协议栈自带的keep alive功能,自动检测网络是否掉线,来释放资源。利用lwip的回调机制,每次建立连接成功的时候回调用acept函数,在里面加一个flag来判断就好。


在main()函数中添加

//断网检测

if(((ETH_ReadPHYRegister(PHY_ADDRESS, PHY_BSR) & PHY_Linked_Status) == 0x00) || (RJ45_COUNTER))
{
RJ45_COUNTER = 1;  //掉线标志位

}

static err_t Tcpsvrpoll(void *arg, struct tcp_pcb *pcb)
{

        //添加

if(RJ45_COUNTER)
{
tcp_keepalive(pcb);
}

}