加载中…
个人资料
老衲五木
老衲五木
  • 博客等级:
  • 博客积分:0
  • 博客访问:353,912
  • 关注人气:330
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

答网友问——lwip内核工作状态、错误标志以及tcp_tmr函数的调用问题

(2012-12-07 22:31:55)
标签:

lwip

raw

tcp_tmr

sequentialapi

杂谈

分类: LwIP常见问题

网友来信:

五木您好! 
     感谢您在百忙之中抽空看我的邮件,抱歉今天又打扰您了,《嵌入式网络那些事:LwIP协议深度剖析与实战演练》已经买到了,在京东上买的,打8.5折,我也给我同事推荐了,大家最近被LwIP搞得有点晕,哈哈。
     我还有一些疑问想请教您一下:
    1、LwIP为我们提供了两种应用程序接口来实现TCP/IP协议栈,分别是RAW API和sequential API,我用的ARM芯片是STM32F103ZET6,ROM是512k,RAM是64K,跑的是uC/OS-II操作系统,您觉得用哪种应用程序接口好一点?
    2、我现在用的是RAW API应用程序接口实现TCP/IP协议栈,现在的情况是这样:我自己建了一个任务,这个任务用于与服务器建立通讯实现数据交换。我现在想在这个任务里建个应用程序框架,这个框架主要用于建立网络连接、接收服务器数据、发送数据给服务器,内核状态(pcb->state)查询、内核错误标志的处理和关闭网络连接等。我现在就是想:1、用个什么样的方法能够得到内核的工作状态,比如现在服务器发了关闭连接信号FIN,客户端此时会进入CLOSE_WAIT状态,那么在不改动内核程序的情况下,我怎样得到这个状态,以便客户端应用程序后面调用tcp_close函数,发出FIN信号给服务器,从而结束数据传输;2、怎么得到内核err错误标志,比如TF_RESET复位,客户端应用程序要知道在复位时要处理一些事情。
     3、tcp_tmr定时函数在哪调用它,内核里好像没调用它,我用断点看了。那么那些超时重发之类的超时信号怎么样得到呢。
     谢谢!

 

回复:
你好,
(1) 看你的系统,ram是有点偏小,你的应用的数据量大吗?你们这种情况用RAW API比较合适,注意自己合适的配置协议栈,不要让内存用超了。
(2)基于sequential API编程时,我们都是基于open-read-write-close这种模式,其中open和read是阻塞的,如果对端关闭,这两个函数会返回NULL,这个时候你就能判断对端关闭了,此时你应调用netconn_close关闭本端连接;当是用RAW API时,需要注册自己的数据接收函数,当对端关闭时,内核会回调你注册的数据接收函数,其进来的指针pbuf为NULL,此时你也可以判断对端关闭了。同时,你可以在数据接收函数里面直接使用控制块pcb->state判断连接当前的状态,并进行你相关的处理。具体的,你可以参见TCP状态机实现那节。
(3)tcp_tmr:如果是使用RAW API编程的话,你需要自己周期性的调用这个函数,500ms为周期,具体参考我书上的相关代码;如果使用sequential API编程,这个是协议栈自己完成的,调用的地方在邮箱等待函数或者信号量等待函数中,内核会同时对各个注册的超时时间进行处理,这里,tcp_tmr会被调用。
    希望能帮到你~

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有