天线|RF射频
直播中

李晓鹏

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

如何从LWIP中得知网线被拔掉或者路由器断电?

RT
使用LWIP与远程服务器连接,可以通过心跳包来判断是否与远程服务器连接正常,但请问MCU如何得知路由器突然断电或者网线突然被拔掉呢?
如果LWIP提供了掉网的通知,请问该调用哪个API,请各路大神不吝赐教!@zuozhongkai @八度空间 @发烧友 @aozima

回帖(9)

林旭

2019-8-20 07:33:30
网卡PHY芯片有个寄存器用来标记连接是否正正常。这个可以用来检测网线是否断开。至于路由器断电的话因为你和远程服务器连接着,调用API函数发送数据貌似时候返回值的,返回值指示数据发送是否成功,如果不成功的话可以多试几次,如果还不行的话就可以任务连接断开了。然后在尝试重新连接服务器,如果一直都连接不上服务器那就说明服务器端出问题了。
举报

张毕鹄

2019-8-20 07:52:59
一些常用的选项,供参考
[C] 纯文本查看 复制代码
rt_err_t socket_config(void){    int keepalive = 1;      //Enable keepalive.    int keepidle = 60;      //idle time is 60s.    int keepinterval = 5;   //sending interval of detective packet    int keepcount = 3;      //detective count.int flag = 1;    if (setsockopt(socket_fd, SOL_SOCKET, SO_KEEPALIVE, (void *)&keepalive, sizeof(keepalive)) < 0)    {        LOG("set Keep-Alive attribute failedn");        return -RT_ERROR;    }    setsockopt(socket_fd, IPPROTO_TCP, TCP_KEEPIDLE, (void*)&keepidle , sizeof(keepidle));    setsockopt(socket_fd, IPPROTO_TCP, TCP_KEEPINTVL, (void *)&keepinterval , sizeof(keepinterval));    setsockopt(socket_fd, IPPROTO_TCP, TCP_KEEPCNT, (void *)&keepcount , sizeof(keepcount));    setsockopt(socket_fd, IPPROTO_TCP, TCP_NODELAY, (void *)&flag , sizeof(flag));    return RT_EOK;}
举报

王涛

2019-8-20 07:59:11
远程服务器的连接我是通过心跳包来判断的,MCU发完心跳包服务器会立刻响应
目前最大的问题就是不知道如何知道路由器突然断电,我用的是ENC28J60,不知道是否有你所说的寄存器可以查询网线是否断开,我晚点查查芯片手册
还有一个问题,假如得知网线拔掉了或者路由器断电了,LWIP的DHCP貌似会有一个重连机制,但我百度查了下这个机制的重连间隔是越来越长的,而我必须要在路由器重新上电之后立马重连,请问是否需要把LWIP的DHCP关闭掉然后重新启动?
举报

张婷婷

2019-8-20 08:11:31
楼主enc28j60用的是中断处理还是轮询的方式?把源码贴出来看看呗
我也正在弄enc28j60,但INT中断一直不能用
举报

更多回帖

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