LWIP+UCOSII TCP客户端 服务端重连的问题,如果服务端先关闭,会死机,是什么情况?

如何解决VxWorks情况下的tcp连接异常快速处理方法,包括客户端死机,reset重起,网线拔掉,对端掉电
[问题点数:20分,结帖人JeffWinner]
如何解决VxWorks情况下的tcp连接异常快速处理方法,包括客户端死机,reset重起,网线拔掉,对端掉电
[问题点数:20分,结帖人JeffWinner]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
相关帖子推荐:
本帖子已过去太久远了,不再提供回复功能。TCP/IP在51单片机上的实现特点和方法
TCP/IP在51单片机上的实现特点和方法
——(详见
李章林1 ,张立民1
( 1 南开大学信息技术科学学院,& 天津 300071 )
摘要:为了实现51单片机接入internet,开发基于51单片机的TCP/IP具有重要意义。为此开发了zlIP,它是针对51单片机的特点使用KeilC51编程语言编写的TCP/IP,具有代码量小和兼容BSD套接字(socket)用户接口等特点。zlIP1.0版注重于运行速度,zlIP2.0版注重于用户接口的易用性,以从不同的角度试验在51单片机上实现TCP/IP的特点。通过比较两个版本的优缺点和吸收国内外其它TCP/IP的优点,分析了在单片机上实现TCP/IP的速度、程序大小、内存大小、编译器等特点,并针对这些特点总结和提出多种技巧和方法,并对这些技巧、方法的优缺点进行了分析。最后讲述了几点关键技术:设计清晰的TCP/IP和应用层的接口、采用前后台和多线程程序结构的比较,内存管理方法和防止多余的内存拷贝,实现数据包整序重发和窗口控制等。
关键词:TCP/IP;单片机;zlIP
中文分类号:&&&&&&&&& && &&&&&&&&&&&&&&&文献标识码:A&&&&&&&&&&& &&&&& &&&&&&&&&文章编号:(2003)-00-0000-00
1 引言&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&& 随着网络应用的不断扩大,将各类电子设备接入Internet的需求越来越大。电子设备入网有多种解决方案:例如使用嵌入式系统,如使用ARM+Linux;一些实现TCP/IP的芯片也已经可以获得,例如Analog
Devices推出的Internet Modem(1);在51系列单片机运行TCP/IP协议栈等。前两种方案具有良好的性能,而在单片机上实现TCP/IP的方案具有很低的价格,在某些对网络速度要求不高的领域,有广阔的应用前景。
2 TCP/IP在单片机上实现的特点
2.1 速度慢
我们先来了解51单片机网络传输的极限速率。TCP/IP发送过程中主要的运算量集中在三个部分:应用程序将数据拷贝到RAM、计算TCP校验和、将RAM中的数据包拷贝到网络设备的发送缓冲区。对每一个字节数据,两次拷贝大致共使用12×2=24个指令周期;计算TCP校验和使用16个指令周期。采用12M的晶振,最高网络传输速度为25K字节/秒。实际上要比这个速度慢,zlIP第一版速度只有11.752K字节/秒。
为了提高速度可以采用快速的单片机比如Winbond公司的77E58或者AVR单片机,当然还可以提高晶振频率。除此之外还有:使用KeilC时,尽量避免使用Reentrant函数,Reentrant类型的函数比一般函数速度要慢很多,但是某些时候为了程序结构的需要必须使用Reentrant,这就需要在速度和结构之间作一个选择;指针使用“指定存储类型”的指针(memory-specific
pointer)(2);精简协议栈去除运算量大但是用处不大的功能,目前zlIP中TCP定时重发时间是固定的,也没有拥塞窗口控制,也没有IP层路由算法;防止数据包的不必要的拷贝;优化计算校验和和内存拷贝函数。
2.2 程序存储空间和外部RAM空间不大
&&& 通常TCP/IP协议栈需要大量的RAM来存储需要被应答的TCP包,如果规定时间内没有被应答则重发这个TCP包,被应答以后释放这个TCP包。
&&& 为了减小RAM使用量,能否不存储需要被应答的TCP包?(3)。当数据包需要重新发送时,如果能够重新产生数据包所需的数据,那时就可以不存储。例如存在于EEPROM中的html网页。但是这种方法存在以下两个缺点:一,TCPIP和应用层接口变得复杂。当需要重发时,必须需要应用层重新产生数据,实际上将TCP负责的重发机制转移到了应用层。应用层程序编写变得复杂。二,对数据无法重新产生的应用不适用。例如语音采集。
&&& TCP/IP一般采用C语言或者混合汇编来写。以KeilC516.0编译器为例。与X8086编辑的代码不同,使用KeilC要注意函数重入、指针、函数指针这三个问题。使用可重入函数和一般指针(generic
pointer)使得程序代码增大,运行速度变慢。使用函数指针时,要么需要手动重建调用树(Call tree),要么将通过函数指针调用的函数都设置为可重入函数。所以尽量少用重入函数、函数指针和一般指针。
3 zlIP的特点和实现技巧
&&& 其它的TCP/IP有lwIP、uIP、ucIP、tinyTCP等。其中lwIP、uIP、tinyTCP已经成功地移植到了单片机。lwIP是专门为微处理器设计的TCP/IP协议栈,lwIP的功能很全面,但是相对来说代码较大,有人做过移植lwip+ucOSII代码量为60K(4)。uIP侧重于减小代码量(选择AVR为目标器件时,代码为5K左右)和减小RAM使用量(100字节左右)。uIP采用了不保存需要应答的数据包的RAM使用方案,没有和BSD的套接字接口兼容,应用层接口较复杂。zlIP介于uIP和lwIP之间,它针对单片机设计,有中等代码量和RAM使用量,使用套接字的应用层接口,所有的外部变量都使用了xdata类型,全部指针都为明确存储类型的指针,需要重入的函数已经声明为reentant,使用KeilC的小模式下编译。使用12M晶振、KeilC编译器、89C52单片下测试的技术参数如下:
表1:zlIP技术参数(Technical parameter of zlIP)
zlIP的版本
代码量(字节)
外部RAM使用量(字节)
发送速度(字节/秒)
2.0版主要功能有:支持套接字形式的多个TCP连接。支持多个网络设备。支持通过网关发送数据包和数据包转发功能。响应ping命令。支持TCP包的整序、重发和窗口控制流量控制。
3.2 zlIP实现TCP/IP的技巧和方法
3.2.1设计套接字接口
&&& zlIP接口函数基本和BSD的套接字接口相同。提供的用户接口函数有:
(2)链表方法:链表方法根据数据包大小分配相应大小的内存块。如图3所示,链表将内存块链接起来,used字段表示该内存块是否正在使用,pSstart和pEend表示数据部分有效数据的开始地址和结束地址。分配时,搜索内存链表找到一个没有分配的比所需空间大的内存块,截取所需的大小。该内存块被截取以后可能还有较多剩余,这时将剩余部分从原内存块中分离出来,成为一个新的内存块,并插入链表。释放时,将used置为假,如果pNext或者pPre指向的内存块也是空闲的,将其和自己合并,以防止内存分片(7)。在协议层之间传送数据包只要传送内存块的起始地址就可以了。这种内存管理方法空间浪费小但是运算量相对较大。
无数据包拷贝是指除了获得数据到RAM和数据包到网络设备发送缓存这两次拷贝外没有数据包的拷贝。这节省了拷贝时间。介绍两种实现方法:
(1)链表方式:例如当应用层将DataSize大小的应用层数据交给TCP层发送,一般的做法是申请一个DataSize+TCPHeadSize大小的内存然后填写TCP头部,并将数据包拷贝到TCP的载荷中。使用链表方式:TCP层只申请TCPHeadSize大小的内存,然后将这个TCPHead用链表连接到应用层数据。这种方式缺点是:同一个数据包的内存不连续,这加大了计算校验和内存释放的复杂度,运算量大。
(2)预留空间方式:应用层为DataSize大小的数据包申请内存的时候,实际申请的是DataSize+AllHeadSize,其中AllHeadSize表示所有协议头部大小总和。拷贝应用层数据时在其前面留出AllHeadSize大小的空余空间。内存块头部的pStart指示了程序所在层的有效数据的开始,例如在应用层时指向应用层数据包的开始地址。应用层将这个数据包传给TCP层以后,TCP层只要在pStart-TCPHeadSize开始的内存空间加一个TCP头部即可。这种方式运算量很小,但是应用层必须事先知道其底层的协议头大小之和,违反了下层协议和上层无关的要求。
3.2.5如何实现整序、重发和窗口控制
&&& zlIP使用了队列缓存的方式来实现。这里队列的一个元素指向一个数据包,队列的最大长度没有限制。对于整序,使用ooSeq队列(7),如果发现接收的TCP包序号并不是希望的,但是序号在接收窗口内,此时我们不能立刻接收这个包也不应丢弃,先将这个包放入ooSeq队列。每当,一个希望的TCP包被接收以后,再查看ooSeq队列现在是否有TCP包成为了希望的数据包,如果有则将其取出并处理。对于重发,使用unacked队列,每一个需要被应答的TCP数据包发送以后都要放入unacked队列,等到被应答以后才从队列中删除。TCP重发定时只针对unacked队列第一个TCP包,如果定时超出,重新发送,重发次数超出规定值,则报错。对于窗口控制,使用unsend队列,如果发现对方的窗口过小无法接收这个数据包,则只发送部分数据,将多余部分放入unsend队列,等待对方发来TCP包通知新的窗口大小时,再次判断是否可以发送了。如果在unsend队列不为空的情况下,我方应用层传来需要发送的数据包都应插入unsend队列。我方的TCP窗口的大小就是剩余内存空间的大小。
3.2.6 捎带应答的实现
&&& 捎带应答指的是,当对方一个需要应答的TCP包到达时,我方不马上给予应答,而是等待一个较短的时间。如果在这段时间内,我方有数据发送,则会捎带给予了应答,这减少了包的发送数量。
[1] (电子文献)中国电子网.ADI具有TCP/IP栈的单片Modem[Z]...
[2] (电子文献)德国Keil公司.Cx51 Compiler[Z]..-110.
[3] (电子文献)Adam Dunkels.uIP - A Free
Small TCP/IP Stack[Z]./adam/uip/index.html..1
[4] (电子文献)Adam Dunkels.lwIP - News
Archive[Z].http://www.sics.se/~adam/lwip/news.html..
[5] (专著)jean j labrosse.μc/os-II-源码公开的实时嵌入式操作系统.邵贝贝等译.[M]北京:中国电力出版社,2001.
[6] (专著)Douglas E Comer,
David L stevens.用TCP/IP进行网际互连第二卷[M]北京:电子工业出版社 ,.
[7] (电子文献)Adam Dunkels.Design and
Implementation of the lwIP TCP/IP Stack[Z].http://www.sics.se/~adam/lwip/
documentation.html..10-19.
了解单片机TCP/IP更多方案:
The specialty and
method in implementation
of TCP/IP in 51 serial MCU
Li Zhanglin1 ,Zhang Limin1
of Information
Technology Science, Nankai University, Tianjin
300071, China )
ABSTRACT:In order to connect a 51 serial MCU to internet, it’s
necessary to develop a TCP/IP especially for 51 serial MCU. So We developed
zlIP, a TCP/IP designed especially for 51 serial MCU with KeilC51. Its
specialties include small code size, compatibility with BSD socket interface
etc. In order to test different aspects in implementation TCP/IP on 51, zlIP
1.0 emphasized on speed while zlIP 2.0 emphasized on facility of user
interface. The thesis analyzed specialties, which include speed, code size, ram
usage and complier, by comparing the tow editions of zlIP and absorbing the
strong points of other TCPIP. The thesis promoted and summarized some methods according
to these specialties and compared these methods. Finally, the thesis analyzed
some key techniques: TCP/IP user interface design, comparison of back-front and
multithread programming structure, memory management and avoidance of redundant
copy of packets, realization of packets arrangement, resending and window
Key word: TCPIP;51单片机TCP_IP_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
41页1下载券69页免费19页免费5页免费6页免费 25页免费242页2下载券4页免费242页2下载券8页1下载券
喜欢此文档的还喜欢5页免费10页免费12页免费6页免费28页免费
51单片机TCP_IP|5单​片​机​T​C​P​_​I​P
把文档贴到Blog、BBS或个人站等:
普通尺寸(450*500pix)
较大尺寸(630*500pix)
你可能喜欢stm32+lwip作为MCU与tcp/ip协议栈,其为一般TCP客户端,具有断开重连机制,并作为HTTP的服务端,求代码!_百度知道
stm32+lwip作为MCU与tcp/ip协议栈,其为一般TCP客户端,具有断开重连机制,并作为HTTP的服务端,求代码!
该单片机作为TCP客户端和HTTP服务器端,在T筏供齿谎佼荷酬捅揣拉CP客户端断开重连(调用tcp_close)时不能影响HTTP的正常访问,如何实现,求代码!
我有更好的答案
按默认排序
我正好也在做这方面的东西,我们可以交流一下,我这边需要做的是TCP客户端和TCP服务器,无这边服务器搭建目前运行状况良好,但是客户端始终不行,请问你有没有客户端的相关例程,我这边的例程也可以分享给你的说,大家相互借鉴,共同进步。周末加了一天班,终于把问题解决了,总结一个血的教训给你,就是:你在调试单片机客户端的时候,作为服务器的电脑防火墙一定要关掉啊,我就是因为这样,白忙了两天。你要实现客户端断开不影响HTTP服务器的运行,就需要建立两个不同的TCP_SERVER_pcb和TCP_C筏供齿谎佼荷酬捅揣拉LI ENT_pcb结构体,分别用于客户端和服务器的TCP/IP协议栈控制。并且需要两个不同的发送和接收缓存,不然是不行的。你留下你的邮箱,我把我的例程发给你一份,然后你可以在此基础上修改为HTTP服务器
你这是tcp服务器和客户端同时运行,如果不用系统的话,好像不可以
其他类似问题
协议栈的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁用QTcpSocket做客户端用来测试TCP,但不能接收数据,求指教!
[问题点数:60分,结帖人ccp668]
用QTcpSocket做客户端用来测试TCP,但不能接收数据,求指教!
[问题点数:60分,结帖人ccp668]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
相关帖子推荐:
2012年10月 移动平台大版内专家分月排行榜第三2012年2月 移动平台大版内专家分月排行榜第三
2012年10月 移动平台大版内专家分月排行榜第三2012年2月 移动平台大版内专家分月排行榜第三
2012年10月 移动平台大版内专家分月排行榜第三2012年2月 移动平台大版内专家分月排行榜第三
2012年10月 移动平台大版内专家分月排行榜第三2012年2月 移动平台大版内专家分月排行榜第三
2013年2月 移动平台大版内专家分月排行榜第三
2012年10月 移动平台大版内专家分月排行榜第三2012年2月 移动平台大版内专家分月排行榜第三
2012年10月 移动平台大版内专家分月排行榜第三2012年2月 移动平台大版内专家分月排行榜第三
2012年10月 移动平台大版内专家分月排行榜第三2012年2月 移动平台大版内专家分月排行榜第三
2012年10月 移动平台大版内专家分月排行榜第三2012年2月 移动平台大版内专家分月排行榜第三
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。

我要回帖

更多关于 stm32 lwip 的文章

 

随机推荐