LWIP之三TCP层发送相关.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
LWIP之三TCP层发送相关

LWIP之TCP层发送相关 2009-05-16 00:42:09标签: 原创作品,允许转载,转载时请务必以超链接形式标明文章 /214870/158415原始出处 、作者信息和本声明。否则将追究法律责任。/214870/158415/214870/158415 2009-5-11 LWIP之TCP层发送相关现在我们正式开始进入对TCP的研究,它属于传输层协议,它为应用程序提供了可靠的字节流服务。在LWIP中基本的TCP处理过程被分割为六个功能函数的实现:tcp_input(), tcp_process(), tcp_receive()【与TCP输入有关】, tcp_write(), tcp_enqueue(), tcp_output()【用于TCP输出】。这些是从大的方面来划分的。现在先从小部tcp.c文件来分析一下:我们知道这里的函数都是被socket那一层的最终调用的。为了利于分析,我选择lwip_send函数来分析,具体不多说,最终调用到了static err_t do_writemore(struct netconn *conn)这个函数,当然这期间也做了不少工作,最主要的就是把发送数据的指针放到了msg的指定变量中msg.msg.msg.w.dataptr = dataptr;//指针msg.msg.msg.w.len = size; //长度这些又经过转化放到了netconn的write_msg中最后就是对do_writemore的调用了,下面详细分析这个函数。这个函数的最直接调用有以下几个:available = tcp_sndbuf(conn-pcb.tcp);err = tcp_write(conn-pcb.tcp, dataptr, len, conn-write_msg-msg.w.apiflags);err = tcp_output_nagle(conn-pcb.tcp);err = tcp_output(conn-pcb.tcp);好,先看tcp_sndbuf这个。从其参数,我们应该想像pcb的重要性。#define tcp_sndbuf(pcb) ((pcb)-snd_buf)//由下面分析得这里直接返回buf大小那就继续跟踪这个pcb好了。是的,这还得从lwip_socket开始,在创建连接netconn的时候调用了do_newconn,它接着调用了pcb_new,在这个函数中如果是tcp的话有以下代码msg-conn-pcb.tcp = tcp_new();哈哈,还记得吧,在前面我讨论到了这里,就没有再讨论了。嗯,现在开始吧。* Creates a new TCP protocol control block but doesnt place it on* any of the TCP PCB lists.* The pcb is not put on any list until binding using tcp_bind().struct tcp_pcb * tcp_new(void){ return tcp_alloc(TCP_PRIO_NORMAL);}也许注释的意义更大一些吧,哈哈,至此,我们从注释可以知道,tcp_bind的作用是把tcp的pcb放入list中,至少是某一个list×××××××××××××××××××××××××××××××××××××××既然都提到了,似乎不说说有点过意不去啊。Lwid_bind函数最终会调用到tcp_bind【当然是tcp为例进行分析】。这个函数也比较有意思,在进入正题之前先来了下面这么个调用if (port == 0) { port = tcp_new_port();}意思很明显,就是分配个新的端口号,有意思的就是这个端口号的分配函数tcp_new_portstatic u16_ttcp_new_port(void){ struct tcp_pcb *pcb;#ifndef TCP_LOCAL_PORT_RANGE_START#define TCP_LOCAL_PORT_RANGE_START 4096#define TCP_LOCAL_PORT_RANGE_END 0x7fff#endif static u16_t port = TCP_LOCAL_PORT_RANGE_START; again: if (++port TCP_LOCAL_PORT_RANGE_END) { port = TCP_LOCAL_PORT_RANGE_START; } for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb-next) { if (pcb-local_port

文档评论(0)

xcs88858 + 关注
实名认证
文档贡献者

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

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档