硬汉嵌入式论坛

 找回密码
 立即注册
查看: 988|回复: 8
收起左侧

[LwIP] 请教下 lwip socket 协议接口拔掉网线后重新插上网线bind失败?

[复制链接]

699

主题

3631

回帖

5753

积分

论坛元老

积分
5753
发表于 2025-6-11 10:17:15 | 显示全部楼层 |阅读模式




请教下 lwip socket 协议接口拔掉网线后重新插上网线bind失败?

使用描述:

开发板定义为 socket server  链接上位机 测试收发都是没有问题的,在 开发板与上位机不断开链接的情况下拔掉网线 后过段时间再重新插上网线后 就链接不上,提示 bind 失败 ,

我就想这之前绑定的 端口号什么的 有没有对应的 解绑 相关函数呀 ?


回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
118312
QQ
发表于 2025-6-14 08:32:29 | 显示全部楼层
参考这个试试

【实战经验分享】一劳永逸的解决网线随意热插拔问题
https://forum.anfulai.cn/forum.p ... 5386&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

699

主题

3631

回帖

5753

积分

论坛元老

积分
5753
 楼主| 发表于 2025-6-14 17:13:04 | 显示全部楼层
eric2013 发表于 2025-6-14 08:32
参考这个试试

【实战经验分享】一劳永逸的解决网线随意热插拔问题

这个方法使用不了呀,  因为在 检测到 拔掉网线后初始化调用 tcpip_init(NULL, NULL);         这个就会卡死, 当然系统启动时第一次调用是没有问题的,

貌似根据测试发现 lwip  tcp socket server  检测到拔掉网线后需要等待  > 3 分钟后再重新插上网线 也是可以 bind 的 ,
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
118312
QQ
发表于 2025-6-15 09:05:11 | 显示全部楼层
hpdell 发表于 2025-6-14 17:13
这个方法使用不了呀,  因为在 检测到 拔掉网线后初始化调用 tcpip_init(NULL, NULL);         这个就会卡死, 当 ...

lwip不行,他没有deinit复位初始化函数。
回复

使用道具 举报

699

主题

3631

回帖

5753

积分

论坛元老

积分
5753
 楼主| 发表于 2025-6-16 08:52:56 | 显示全部楼层
eric2013 发表于 2025-6-15 09:05
lwip不行,他没有deinit复位初始化函数。

貌似 在 lwip 里面也没有找到 解绑的函数
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2025-7-3 16:58:08 | 显示全部楼层
楼主最后你解决了吗,我最近也在搞这个lwip单片机做为server,热插拔就是不行,但是udp和client热插拔倒是可以
回复

使用道具 举报

7

主题

129

回帖

150

积分

初级会员

积分
150
发表于 2025-7-3 17:27:18 | 显示全部楼层
hourxyl 发表于 2025-7-3 16:58
楼主最后你解决了吗,我最近也在搞这个lwip单片机做为server,热插拔就是不行,但是udp和client热插拔倒是 ...

你们说反了吧,server是被动连接的,只要客户端重新发起连接就行,随便热拔插都没关系,MCU做客户端就稍微复杂一些,需要检测网线是否断开重新连接上,再去主动连接。
我用裸机测试过程是这样的,作为客户端重新连接服务器还没搞好。
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2025-7-9 22:22:01 | 显示全部楼层
hpdell 发表于 2025-6-14 17:13
这个方法使用不了呀,  因为在 检测到 拔掉网线后初始化调用 tcpip_init(NULL, NULL);         这个就会卡死, 当 ...

楼主现在解决的么,和你一样的问题
回复

使用道具 举报

699

主题

3631

回帖

5753

积分

论坛元老

积分
5753
 楼主| 发表于 2025-8-30 17:59:24 | 显示全部楼层
本帖最后由 hpdell 于 2025-8-30 18:02 编辑
XMDB 发表于 2025-7-9 22:22
楼主现在解决的么,和你一样的问题



01.   sock = socket(AF_INET, SOCK_STREAM, 0);

02.   connected = accept(socket_info.sock, (struct sockaddr *)&client_addr, &sin_size);

03.  rx_len = recv(connected, rxbuf, TCP_RX_BUFSIZE, 0);

当检测到拔掉网线后就删除:
      
       if(rx_len  <= 0)   {   // 检测到拔掉网线
        if(connected >= 0)  {
                closesocket(connected);
                connected = -1;
        }        
        
        if(sock >= 0) {
                closesocket(sock);
                sock = -1;
        }
}


删除完成后再把之前等待链接的套路重新来过一遍即可




回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-9-26 11:45 , Processed in 0.042460 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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