W5500作为服务器突然断线

news/2024/11/25 16:04:24/

大家是否遇到过这样的问题,W5500作为服务器已经建立连接,突然网线掉了,然后再去连接W5500,就连不上了。为什么?下面对这个问题进行解释说明,并提出解决办法。

图1中的上位机程序作为客户端,连接W5500服务器。

图2是对这个问题的wireshark抓包说明。其中192.168.11.114为W5500的IP,192.168.11.110为PC的IP。下图中的第48个包是第一次握手:建立连接时,客户端发送SYN包到服务器,等待服务器确认;第49个包为第二次握手:服务器收到SYN包,必须确认客户的SYN同时自己也发送一个SYN包,即SYN+ACK包。第50个包为第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK,此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。在第70个包中显示,PC向W5500发送9个字节数据,在第73个包中,W5500向PC发送9个字节数据。此时,突然拔掉网线,并点击图1 “Disconnect”按钮,图1中的第160个包显示的是PC发送FIN+ACK包,第161包,W5500发送应答。然后连上网线,并且点击图3的“connect”,但是无法连接。

这是因为,网线没掉之前,W5500处于SOCK_ESTABLISHED状态,此时突然拔掉网线,SOCKET状态没变,还是SOCK_ESTABLISHED状态,没有监听,所以无法再次连接。

图1 wireshark 抓包

图1 wireshark抓包

图2 上位机建立连接

图2 上位机建立连接

图3 nokeepalive 第二次连不上

图3 网线掉了,再插上网线连接不上

解决方法:

Sn_KPALVTR寄存器配置了socket  n 的keep-alive包传输时间间隔。只在TCP模式下生效,单位时间为5秒。Keep-alive包会在Sn-SR 寄存器变为SOCK_ESTABLISHED之后,且与对方至少进行过一次收或发的通信后进行传输。如果Sn_KPALVTR>0,W5500在设置的时间间隔后自动传输keep-alive包以检查TCP的连接状态(自动在线检验),如果对方不能在超时计数期内反馈keep-alive包,这个连接将会被关闭并触发超时中断。如果‘Sn_KPALVTR = 0’,将不会启动自动在线验证,主机可以通过向寄存器Sn-CR写入SEND_KEEP命令发送keep-alive包(手动在线验证)。在‘Sn_KPALVTR> 0’时,将会无视手动在线验证。

自动检验:只需在主函数中,向寄存器Sn_KPALVTR写入不为0的数,即可启动自动在线检验。在函数中写入下面的函数,那么在W5500与对方进行过一次数据通信后,10秒后W5500自动发送keep-alive包。

例如:voidsetkeepalive(SOCKET s)

{

IINCHIP_WRITE(Sn_KPALVTR(s),0×02);

}

Wireshark抓包如图4

1-3包是三次握手过程,5-10包是发送和接收数据的过程,19包是W5500向PC发送keep-alive包,20包是PC对keep-alive包的应答。10秒之后,即是第30包,W5500又发送一次keep-alive包。此时拔掉网线,点击“Disconnect”。10秒之后,W5500发送的keep-alive包没有反应,SOCKET关闭。然后连上网线,点击“Connect”按钮,可以重新建立连接,109-111包是第二次建立连接过程。

图4 keepalive断开后再连接

图4 启用keep-alive后可以重新建立连接

以上演示的是自动发送keep-alive包的过程,如果想手动发送keep-alive包,把Sn_KPALVTR寄存器写入0,当向Sn-CR写入SEND_KEEP命令时,W5500发送一次keep-alive包。

voidsend_ka(SOCKET s)

{

IINCHIP_WRITE(Sn_CR(s),Sn_CR_SEND_KEEP);

return;

}

 By Catherine

程序下载:http://wizwiki.net/forum/viewtopic.php?f=90&t=1072


http://www.ppmy.cn/news/287004.html

相关文章

STM32/TMS320F2812+W5500硬软件调试总结

使用STM32W5500方案是一种比较节省CPU开支的方案,无需多余的CPU资源管理Lwip协议。 调试的时候很多情况下无法通信,现结合笔者近10年的调试经验(每次用W5500做板子,不会说是一帆风顺的- -),总结一下经常出…

基于STM32F407+W5500的freemodbus tcp移植与实现

环境:STM32CUBEMX6.6.1 MDK532 freemodbus1.6 首先是创建能驱动W5500的工程 主要用到硬件为SPI UART SPI速度建议不要太快,SPI1可以设置到40M,但是没必要这么快。 导出工程 添加fputc重定义 找到W5500官方例子 参考例程WIZnet W5500/W…

Stm32F407与W5500用DMA通信

详见 https://javakys.wordpress.com/2014/09/04/upgrade-w5500-throughput-on-nucleo-stm32f401re-using-spi-dma/

基于stm32f407下的W5500网卡驱动(上)

前段时间布置的任务是弄w5500的驱动,w5500本身硬件就具有tcp/ip协议,这样就省去了再把tcp协议栈移植到Uclinux的麻烦,而且我的存储空间一直是不够用的,所以选择w5500作为一个网卡来使用是再合适不过。 仔细看了一遍w5500的说明pdf…

W5500寄存器描述

4 寄存器描述 4.1 通用寄存器 MR (模式寄存器 - Mode Register) [R/W] [0x0000] [0x00]2 2 注脚符号 : 【可读/写】【内存地址】【默认值】 - [Read/Write] [Address] [Reset value] 该寄存器用于 S/W 复位,ping block模式和PPPoE模式。 表格 6 通用寄存器描述…

生信宝典文章集锦,一站式学习生信!众多干货,有趣有料

生信的作用越来越大,想学的人越来越多,不管是为了以后发展,还是为了解决眼下的问题。但生信学习不是一朝一夕就可以完成的事情,也许你可以很短时间学会一个交互式软件的操作,却不能看完程序教学视频后就直接写程序。也…

送书 | 知乎阅读300w+的生信学习指南(更新版)

先送书 在上周的留言送书活动中,恭喜下面这位读者获得书籍“Oracle高性能系统架构实战大全”,请及时与生信宝典编辑(shengxinbaodian)联系。 2020过去三分之一了,您年初定的小目标完成多少了呢?您又发生了哪…

生信宝典教程大放送,一站式学习生信技术

生物信息学包含生物数据分析、数据可视化、重复工作程序化,是生物、医学科研必备的技能之一。生信宝典精心组织生信学习系列教程、生信工具精品教程,通过大量的生信例子、关键的注释、浓缩的语句和录制的视频帮助快速掌握生信知识。 征稿:诚邀…