![](https://csdnimg.cn/release/download_crawler_static/86286655/bg5.jpg)
应用程序
uIP
网卡驱动 系统定时器
UIP_APPCALL
uip_periodicuip_input
应用层
uIP协议栈
硬件驱动
图 57.1.2.1 uIP 在系统中的位置
从上图可以看出,uIP 协议栈主要提供 2 个函数供系统底层调用:uip_input 和 uip_periodic。
另外和应用程序联系主要是通过 UIP_APPCALL 函数。
当网卡驱动收到一个输入包时,将放入全局缓冲区 uip_buf 中,包的大小由全局变量 uip_len
约束。同时将调用 uip_input()函数,这个函数将会根据包首部的协议处理这个包和需要时调用
应用程序。当 uip_input()返回时,一个输出包同样放在全局缓冲区 uip_buf 里,大小赋给 uip_len。
如果 uip_len 是 0,则说明没有包要发送。否则调用底层系统的发包函数将包发送到网络上。
uIP 周期计时是用于驱动所有的 uIP 内部时钟事件。当周期计时激发,每一个 TCP 连接都
会调用 uIP 函数 uip_periodic()。类似于 uip_input()函数。uip_periodic()函数返回时,输出的 IP 包
要放到 uip_buf 中,供底层系统查询 uip_len 的大小发送。
由于使用 TCP/IP 的应用场景很多,因此应用程序作为单独的模块由用户实现。uIP 协议
栈提供一系列接口函数供用户程序调用,其中大部分函数是作为 C 的宏命令实现的,主要是为
了速度、代码大小、效率和堆栈的使用。用户需要将应用层入口程序作为接口提供给 uIP 协议
栈, 并将这个函数定义为宏 UIP_APPCALL()。这样,uIP 在接受到底层传来的数据包后,在
需要送到上层应用程序处理的地方,调用 UIP_APPCALL( )。在不用修改协议栈的情况下可以
适配不同的应用程序。
uIP 协议栈提供了我们很多接口函数,这些函数在 uip.h 中定义,为了减少函数调用造成
的额外支出,大部分接口函数以宏命令实现的,uIP 提供的接口函数有:
1,初始化 uIP 协议栈:uip_init()
2.处理输入包:uip_input()
3.处理周期计时事件:uip_periodic()
4.开始监听端口:uip_listen()
5.连接到远程主机:uip_connect()
6.接收到连接请求:uip_connected()
7.主动关闭连接:uip_close()
8.连接被关闭:uip_closed()
9.发出去的数据被应答:uip_acked()
10.在当前连接发送数据:uip_send()
11.在当前连接上收到新的数据:uip_newdata()
12.告诉对方要停止连接:uip_stop()
13.连接被意外终止:uip_aborted()
接下来,我们看看 uIP 的移植过程。首先,uIP1.0 的源码包里面有如下内容,如图 57.1.2.2