RAWLWIP中telnet功能实现分析.docx

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
RAW LWIP中telnet功能实现分析背景:要在项目中实现一个下位机的以太网通信,由于不能使用嵌入式操作系统,所以只好使用回调函数的方法来进行实现。大致看了一下前辈老衲五木写的“LWIP协议栈源码详解”,因为还有课以及别的事情,所以看的并不深入,也只是了解一个大概。本来是不打算写的,但是看到网上相关的资料好少,很多还没有什么价值,当然其实最重要的原因是在百度文库里面下载文档各种需要下载卷,但是作为工科屌丝的我,并不能买得起什么会员,所以每次都是紧盯着是不是免费下载。。。唉,也是醉了。。。现在还是10月2号,宅在实验室。平台:开发板为STM32F107VC(从实验室别的师兄那里淘来的一块开发板,然后自己玩),keil4(建议将编译连接里面的优化等级修改得低一点,我设置的是level 2,优化等较较高的时候,不考虑带来的别的负面因素,仅仅是调试的时候单步的箭头各种乱跳就够烦人的了)。实现的功能:使用cmd输入telnet 192.161.1.6(默认的telnet端口号为23,分配给开发板的IP地址,将电脑的IP地址设为192.168.1.1);开发板能通过网线传送给电脑一些数据,如what’s your name?在cmd中输入john;开发板通过网线在传送给电脑一些数据,如hellow,john;使用ctrl+]快捷键进入到telnet中,输入quit,结束telnet;程序的实现:注:主要分为两部分对程序的实现进行说明,其一是LWIP协议栈与应用层的接口,实际就是我们自己编写的用户程序,使用回调函数的功能与LWIP协议栈进行信息的交互;其二是LWIP协议栈对来自电脑的telnet的命令的响应过程(可能不同版本的协议栈的具体代码会有差别,但是运行机制应该是一致的);用户接口函数:在对开发板进行系统配置,硬件自检以及LWIP进行初始化(缓冲堆,缓冲池的初始化,IP,掩码,默认网关的初始化,设置MAC地址,建立网络链接等)之后,使用HelloWorld_init();对要实现的telnet功能进行初始化设置,这个函数也就是我们在应用层与LWIP协议栈的接口。这几行代码主要是建立一个新的TCP控制块,并且将其状态设置成listensing。其中与编程具有重要关系的是最后一句,即将函数HelloWorld_accept()与TCP控制块中的回调函数接口链接起来。接下来就是该函数的编写了。这个函数里面又具体可以分为两个方面,一个方面是将接收函数HelloWorld_recv()与TCP控制块中的回调函数接口链接起来(当然也可以在编写一些别的接口函数),但这个函数是可以对开发板接收到的来自电脑的信息进行处理;另一个方面是使用tcp_write()函数将在函数HelloWorld_accept()中需要发送的信息(比如提示信息)挂到发送列表上,这是不能马上发送的。注:由于这些是从一个demo程序中得到的一些东西,而那个demo程序本身代码又写得有点乱,所以就不贴代码了。LWIP协议栈的响应:主要流程是:底层信息接收函数调用相对较高一层的信息接收函数。啰嗦一句:我是使用的中断机制来处理以太网信息的。第一步,进入到中断服务程序中:其中err = netif-input(p, netif);是使用回调函数调用函数ethernet_input(struct pbuf *p, struct netif *netif);该函数根据收到的以太网帧中的协议类型字段,分别将调用不用的上层函数。由于telnet是IP类报文,所以就将调用IP报文输入函数ip_input(p, netif);该函数又将根据IP报文中的协议类型字段调用传输层协议,由于telnet是使用tcp协议,故调用tcp输入函数。tcp_input(p, inp);到这里,我们就接触到了在LWIP协议栈中非常核心的一个函数。该函数除了进行一些头部校验,以及一些判断之后,会调用状态机处理函数tcp_process(pcb); 就相当于是LWIP协议站的大脑,对协议栈的工作状态进行调度。在调用状态机处理函数之后,TCP_EVENT_RECV()函数也会被调用,该函数实际是调用用户自己便携的信息接收应用层处理函数,即 HelloWorld_recv(),之后 tcp_output(pcb)也会被调用,用来将开发板上需要输出的信息输出。以上这些,好像看不出用户定义的函数HelloWorld_accept()是在哪里被调用的,其实和HelloWorld_recv()被调用的方式一样,只是函数HelloWorld_accept()是在tcp_process(pcb);中被调用的, TCP_EVENT_ACCEPT(pcb, ERR_OK, err);至于状态机中各种状态之间的转换,可以参照前辈老衲五木

文档评论(0)

dashewan + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档