嵌入式技术论坛
直播中

而无返还

8年用户 1155经验值
擅长:光电显示
私信 关注
[问答]

wiznet创建socket失败的原因?

每次创建socket时,总是要报socket(0) is not closed(0x22).,
持续几次后才创建成功,而且我在初始化时在wiz_socket_init中增加了关闭每个socket的语句,但是还是会出现这种情况,
有大佬知道这是为什么吗,为什么会处于UDP状态

回帖(4)

糖栗子

2023-9-3 11:03:18
不知道你用的是Wiznet公司的那个模块,我以前用过5300,5500。你出现的这个问题建议你可以通过以下方式排除问题:
(1)排除焊接问题,如果焊接不好,则数据读写就错误,可以通过读取一个固定寄存器打印出来看你的MCU和wiznet芯片之间的数据连接是否正常。
(2)排除网络端故障,这个可以通过芯片在硬件联网成功后的指示灯初步判断网络是否正常。
(3)创建接口,用简单的ICMP协议中来做双向ping操作。
以上都没有问题,再考虑创建UDP,TCP包协议。因为你的故障原因描述不是很详细,只能提这点小建议,希望你帮助到你。
举报

听我讲

2023-9-28 09:29:03
这可能是由于在创建 socket 之前没有正确地关闭之前的 socket 导致的。在使用 WIZnet 的模块时,每个 socket 只能同时被一个任务所使用,因此当一个任务要使用 socket 时,必须先确保之前使用的 socket 以正确的方式被关闭。

您也可以尝试增加一个延迟时间,并在创建 socket 之前先等待片刻,以确保之前的 socket 已被关闭。此外,您需要确保正确地设置 socket 的通讯协议和端口号以及 IP 地址等参数,同时确认您是否有足够的内存空间来创建新的 socket。

至于为什么会处于 UDP 状态,这可能是因为您在代码中指定了 UDP 通讯协议,或者可能是默认的协议,需要检查和确认您的代码中的设置。
举报

吴达川

2023-10-27 15:53:39
原因:
这是因为网卡在link up时会去检查网络联网状态,会调用"sal_check_netdev_internet_up"这个函数,在这个函数中会创建"net_work"工作队列,处理函数为"check_netdev_internet_up_work",在这个处理函数中会去申请UDP的socket向"link.rt-thread.org"这个网址发送系统版本信息,如果没有接收到回复则判断该网卡无法联网。
举报

吴达川

2023-10-27 16:06:12
原因:
      这个是因为网卡在link up时会去检查是否具有联网功能。调用的主要函数是: "netdev_low_level_set_link_status"设置网卡状态--->"sal_check_netdev_internet_up"创建"net_work"工作队列回调函数为"check_netdev_internet_up_work".在这个回调函数中会去申请UDP socket往"link.rt-thread.org"这个网址发送系统的版本信息,如果接收到回复则认为该网卡成功连接到外网。
解决:
     关闭联网状态检查功能。宏定义为: SAL_INTERNET_CHECK
举报

更多回帖

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