



全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
一 TCP的PCB结构此PCB管理tcp协议,包括连接、数据包、收发等状态一、tcp.c实现的函数:1、err_t tcp_close(struct tcp_pcb *pcb)说明:断开PCB中的连接,释放其占用资源,无论其正在监听或已经建立了连接。参数:pcb表示要关闭的协议控制块。返回:ERR_OK表示连接已经被断开,其它表示pcb没有被断开,其资源没有被释放。PCB(protocol control block)协议控制块,包括tcp和udp等多种,每种协议有自己的协议控制块,如tcp_pcb。另外,err开头的数据类型一般是int型,表示状态,一般不需理会。2、err_t tcp_bind(struct tcp_pcb *pcb, struct ip_addr *ipaddr, u16_t port)说明:设置某个协议控制块用于连接的本地ip地址和端口号。参数:pcb协议控制块;ipaddr表示ip地址的结构体,用IP_ADDR_ANY设置默认本地ip地址;port表示16位端口号。返回:ERR_USE表示端口号被占用,ERR_OK表示设置成功ip_addr结构体中只有一个32位整数项:ipaddr-addr,ip地址应由高到低位依次填充该项。这个IP地址的结构体应该在使用本函数前事先定义好。3、struct tcp_pcb *tcp_listen_with_backlog(struct tcp_pcb *pcb, u8_t backlog)说明:设置该TCP协议控制块为连接监听状态,即作为主机角色来等待客户端申请连接。参数:pcb协议控制块;backlog最大连接数限制,8位无符号整数,最大为255。一般应用是我们用tcp_listen(pcb)宏来替换这个函数,这个宏将backlog自动设置为255。3、 void tcp_recved(strcut tcp_pcb *pcb, u16_t len)说明:在应用程序处理接收的数据之前,应该先调用该函数来扩大tcp窗口长度。参数:pcb协议控制块;len应用程序总共读取的数据长度。4、static u16_t tcp_new_port(void)说明:分配一个新的端口号,(不与已经使用的端口号重复)返回:新端口号,16位无符号整数。5、err_t tcp_connect(struct tcp_pcb *pcb, struct ip_addr *ipaddr, u16_t port,err_t (* connected)(void *arg, struct tcp_pcb *tpcb, err_t err)说明:作为一个客户端的角色来连接一个主机,连接成功后会调用参数中提供的“connected”函数(自己编写的函数,用于处理连接后的工作)。参数:pcb协议控制块;ipaddr远端主机ip地址;port远端主机端口号;connected需要被调用的函数地址(函数名),否则会出错。返回:状态,ERR_VAL表示参数错误(ip地址错误),ERR_OK表示连接申请已经发出,其它表示连接申请不能发出。6、void tcp_setprio(struct tcp_pcb *pcb, u8_t prio)说明:设置连接的优先级,直接修改pcb-prio项。参数:pcb协议控制块,prio优先级7、static void tcp_kill_prio(u8_t prio)说明:终止比prio优先级低或相等的其它有效的连接。参数:prio最小优先级。8、struct tcp_pcb *tcp_alloc(u8_t prio)说明:创建一个新的TCP协议控制块,为其pcb分配新空间并自动填充。参数:prio新pcb的优先级,可能会终止其它连接。返回:新pcb指针,状态是CLOSED关闭的。9、struct tcp_pcb *tcp_new(void)说明:用于创建一个新TCP协议控制块。该pcb在用tcp_bind函数绑定前,并不放在TCP PCB链表中。返回:状态是关闭的新pcb指针。这个函数直接用中间优先级64(可设置)去调用tcp_alloc函数返回结果。10、void tcp_arg(struct tcp_pcb *pcb, void *arg)说明:用于给tcp_recv函数(下一个讲)中指定的回调函数传递参数。参数:所传递的参数(以指针的形式)。这个函数直接修改pcb-callback_arg项。11、void tcp_recv(struct tcp_pcb *pcb,err_t (*recv)(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err)说明:用于指定当TCP连接接收到数据后所调用的函数。参数:pcb协议控制块;recv所指定的函数地址(函数名)这个函数直接修改pcb-recv项。12、void tcp_send(struct tcp_pcb *pcb, err_t (*send)(void *arg, struct tcp_pcb *tpcb, u16_t len)说明:用于指定当TCP连接成功的发送一个数据包到远端后所调用的函数。参数:pcb协议控制块;send所指定的函数地址(函数名)这个函数直接修改pcb-send项。13、void tcp_err(struct tcp_pcb *pcb,void (*errf)(void *arg, err_t err)说明:用于指定当前连接发生崩溃性错误后所调用的函数。参数:pcb协议控制块;errf所指定的函数地址(函数名)这个函数直接修改pcb-errf项。14、void tcp_accept(struct tcp_pcb *pcb, err_t (* accept)(void *arg, struct tcp_pcb *newpcb, err_t err)说明:用于指定当前连接在监听状态时有其他端口与之连接成功后所调用的函数。参数:pcb协议控制块;accept所指定的函数地址(函数名)这个函数间接性的修改了pcb-accept项。15、void tcp_poll(struct tcp_tcb *pcb, err_t (* poll)(void *arg, struct tcp_pcb *tpcb), u8_t interval)说明:用于指定TCP周期性的回调函数。参数:pcb协议控制块;poll所指定的函数地址(函数名);interval粗糙的指定TCP周期间隔时间。这个函数每秒钟被调用两次,直接修改pcb-poll和pollinterval这两项。16、void tcp_pcb_purge(struct tcp_pcb *pcb)说明:用于清理TCP PCB。清空缓存数据并释放缓存资源。参数:pcb被清理的协议控制块。但是这个协议控制块本身还存在。二、tcp_out.c实现的函数1、err_ttcp_write(struct tcp_pcb *pcb, const void *data, u16_t len, u8_t apiflags)说明:发送TCP数据包,但并不会立即发送。参数:pcb协议控制块;data要发送的数据指针;len要啊发送的数据长度;apiiflags包括下面两种标识TCP_WRITE_FLAG_COPY表示数据会被复制到栈内缓存后再发送,TCP_WRITE_FLAG_MORE表示在最后的片段上置位PSH选项。返回:ERR_OK表示发送成功,其它表示发送失败。实际上这个函数仅是将数据放入发送队列中,但并不会立即发送,它会等待更多的数据一并发送,这样会更有效率。如果需要立即发送的话,这个函数用后要调用tcp_output函数(下一个讲)。2、err_t tcp_output(struct tcp_pcb *pcb)说明:从发送队列中查看有多少待发送的数据包,并将它们发送出去。参数:pcb协议控制块返回:ERR_OK表示发送成功或没有可发送的数据,其它表示出错。3、void tcp_keepalive(struct tcp_pcb *pcb)说明:保持链路处于live状态,尽管没有数据4、err_t tcp_enqueue(struct tcp_pcb *pcb, void *arg, u16_t len, u8_t flags, u8_t apiflags, u8_t optflags)说明:将TCP数据排序以发送5、err_t tcp_output(struct tcp_pcb *pcb)说明:发送能够发送的数据6、static void tcp_output_segment(struct tcp_seg *seg, struct tcp_pcb *pcb)说明:发送TCP分段7、void tcp_rexmit(struct tcp_pcb *pcb)说明:将第一个没有ACK的数据段重传8、void tcp_rexmit_rto(struct tcp_pcb *pcb)说明:重传所有没有ACK的数据段9、void tcp_rst(u32_t seqno, u32_t ackno, struct ip_addr *local_ip, struct ip_addr *remote_ip, u16_t local_port, u16_t remote_port)说明:发送rst消息10、err_t tcp_send_ctrl(struct tcp_pcb *pcb, u8_t flags)说明:发送没有数据的flag包11、void tcp_zero_window_probe(struct tcp_pcb *pcb)说明:当对方的通告窗口为0时,持续定时器向对方发送一个探测报文,判断对方接收窗口是否已经打开三、tcp_in.c实现函数1、static err_t tcp_listen_input(struct tcp_pcb_listen *pcb)说明:当监听的接口需要的分段到达的动作,被tcp_input()调用2、void tcp_input(struct pbuf *p, struct netif *inp)说明:TCP输入最初始的处理,包括头验证和分用3、static void tcp_parseopt(struct tcp_pcb *pcb)说明:解析进入分段的参数4、static err_t tcp_process(struct tcp_pcb *pcb)说明:实现TCP的状态机5、static u8_t tcp_receive(struct tcp_pcb *pcb)说明:被tcp_process调用;首先检查是否是对Buff数据的ack,如是则释放空间;接着是接收数据6、static err_t tcp_timewait_input(struct tcp_pcb *pcb)说明:被tcp_input调用,当处于TIME_WAIT状态的连接分段到达 lwIp的作者做了大量的工作以方便像我这种懒人移植该协议栈,基本上只需修改一个配置头文件和改写3个函数即可完成lwIP的移植。要改写的3个函数都位于网络的最底层,它取决于你使用的是何种网络接口芯片,比如非常常见的RTL8201Bl,最近很火的TI的lm3s6000/8000/9000系列片上集成的网络接口模块等等。之所以要改写,是因为勤劳的lwIP作者已经写出来这三个函数的基本雏形,再次感谢Adam。要改写的函数位于lwIP-1.3.0/src/netif/ethernetif.c中,你也可以用自己更合适的网络接口名来代替“ethernetif”。另外还有一个配置头文件,叫做lwipopts.h文件,它要放在工程目录下。这个文件来源于lwIP-1.3.0/src/include/lwip/opt.h头文件,是对整个协议栈的一个配置,比如是否使用TCP/UDP/DHCP协议等等。 先来看看移植要注意的三个函数,第一个函数为ethernerif_init()函数,这个函数先是设置与协议栈有关的底层操作,指定底层接收回调函数等,接着对实际网络接口芯片进行初始化,设置硬件的工作方式,开放中断等。第二个函数为low_
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 老年人眼病防治课件
- 《中国古典文学鉴赏》课程简介与教学大纲
- 《英国文学史及选读》课程介绍与教学大纲
- 醛酮亲核加成反应课件
- 专题五 列表(课件)-《Python程序设计》职教高考备考讲练测
- 实验仪器与操作-2025年新初三化学暑假专项提升(人教)原卷版
- 老年人安全知识培训简报课件
- 老年人安全常识课件
- 同角三角函数的基本关系式与诱导公式专练-全国高考数学一轮复习(提高版)
- 第八节 第1课时 审题上-4大策略找到解题突破口2026年高三数学第一轮总复习
- 湖北省宜昌市2024-2025学年七年级上学期起点监测英语试卷(含答案无听力音频及原文)
- 大语言模型与安全 课件 第3章 多模态大语言模型
- 尿液感染组学在尿路感染诊断中的价值
- 2025 年扬州市四年级数学秋季期末测 - 基础卷及答案(苏教版)
- 土石方工作安全培训课件
- 2025中华医学会肺癌临床诊疗指南解读课件
- 神经外科专科建设与发展
- 考研英语二语法总结
- 银行科技安全审计方案(3篇)
- 2025标准建设银行贷款合同范本
- 校家社培训家长课件
评论
0/150
提交评论