关于LWIP断开网线后重连问题(热插拔问题)
2014-07-17 16:38
1316 查看
最近在弄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);
}
}
问题: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);
}
}
相关文章推荐
- 关于LWIP断开网线后重连问题(热插拔问题)
- Qt关于mysql数据库断开重连的问题
- 关于C#Socket断开重连问题
- 关于“远程桌面连接已断开”问题的处理
- 关于socket编程中服务器端如何检测客户端连接断开的问题
- 关于将XMPP server部署到Tomcat上的一些问题及断开连接不上解决
- 关于检测TCP非正常断开的问题
- 关于“远程桌面连接已断开”问题的处理(转)
- 关于B/S判断浏览器断开的问题讨论
- 关于客户端长时间自动断开的问题
- 关于ISA2004内网卡网线拔插造成ISA代理失效问题的一种解决方法(下列错误而失败:0x80072
- 关于网线的一些问题
- python 多线程服务器验证,实现断开重连,信号量解决主线程Ctrl+C不退出问题,多线程打印错行问题
- 关于LWIP_1.4.1在STM32平台移植后大数据包ping不通问题
- QTcpSocket断开后自动重连问题 auto connect after disconnected
- 关于网线线序导致网络不通的问题
- 请教问题:关于网络--关于一根网线有两个静态IP
- 关于win2003服务器远程断开后自动注销的问题解决
- 关于socket判断连接断开并重连