文档库 最新最全的文档下载
当前位置:文档库 › IP协议栈API函数介绍V1.02

IP协议栈API函数介绍V1.02

编号

unIP协议栈API函数介绍

Function View

修订记录

日期版本编写及修订者编写及修订说明2006/5/11 V1.00 初始版本

2006/5/30 V1.02 lijian 修订

目录

修订记录 (2)

1网络接口层API函数列表 (4)

2动态内存管理模块API函数说明 (6)

3缓冲区(PBUF)管理模块 (7)

4UDP层API函数说明 (10)

5TCP层API函数说明 (12)

6网络字节辅助函数API (17)

1 网络接口层API 函数列表

网络接口层的功能是建立、配置、修改网络接口,本层的API 均以netif 做为前缀。本层的API 函数及功能如表 1所示。

表 1 网络接口层API 函数功能列表

netif_init()

函数原型 void netif_init(void) 参数 无 返回值 无

功能说明 网络接口部分初始化

netif_add()

函数原型 struct netif *netif_add(struct ip_addr *ipaddr, struct ip_addr *netmask, struct ip_addr *gw,

void *state,

rct netif *netif),

truct netif *netif)) err_t (*int)(st err_t (* input)(struct pbuf *p, s 参数 ipaddrip ip 地址指针 指定新接口ip 地址

netmaskip ip 地址指针 指定新接口子网掩码 gw ip 地址指针 指针指定新接口网关 state 无 类型指针用于传递参数至接口处理函数 针init 回调函数指 用于初始化本网络接口包括网络接口的名称例如 eth0,lo0等。还要指定新接口最大传输单元,MTU ,注 册新接口的数据发送回调函数 input 回调函数指针 当网络接口函数收到一个完整的链路层数据之后,会 将链路信息去掉,然后将packet 交给由此回调函数处 理。在TCP/IP 协议中,此函数应该为ip 层的input 函 数指针 返回值

功能说明 网络接口部分初始化 netif_set_addr()

函数原型 void netif_set_addr(struct netif *netif, struct ip_addr *ipaddr,

struct ip_addr *netmask, struct ip_addr *gw) 参数 netif

网络接口指针 ipaddr 新的ip 地址指针 netmask 新的子网掩码指针 gw 新的网关指针

返回值

功能说明 设定网络接口的ip 地址指针,子网掩码和网关为给定值 netif_remove()

函数原型 void netif_remove(struct netif *netif)

参数 netif 网络接口指针

返回值

功能说明 删除指定网络接口,并回收该接口锁占用所有资源 netif_find()

函数原型 struct netif *netif_find(char *name) 参数 name 字符串 网络接口的名字(如eth0,sl0等)

返回值

网络接口指针

功能说明 寻找指定名字的网络接口,并返回其地址。若没找到,则返回0。

网络接口的名字是在函数netif_add 中设定的init 函数中赋值的 netif_set_default()

函数原型 void netif_set_default(struct netif *netif) 参数 netif 网络接口指针

返回值

功能说明 指定系统默认的网络接口,当没有匹配的接口时,packet 均通过此接口发送至internet 。

对于单网络接口也应该执行此函数,设定默认接口netif_set_ipaddr()

函数原型 void n addr(strct netif etif_set_ip *netif, struct ip_addr *ipaddr) 参数 新的ip 地址指针

netif

网络接口指针 ipaddr 返回值

功能说明 设定指定接口的ip 地址,可以咏本函数实现运行期改变某接口的ip 地址 netif_set_netmask()

函数原型 etif_set_n tif *netif, struct ip_addr *netmast) void n etmask(struct ne 参数 ask 新的子网掩码指针

netif

网络接口指针

netm 返回值

功能说明 设定指定接口的子网掩码 netif_set_gw()

函数原型 etif_set_g etif, struct ip_addr *gw) void n w(struct netif *n 参数 新的网关的ip 地址指针

netif

网络接口指针

gw 返回值 无

功能说明 设定指定接口的网关

2 动态内存管理模块API 函数说明

本模块的功能是动态分配和释放一段内存区域。该模块的内存分配算法源自LwIP 自带的内存管理模块。本层的API 函数及功能如表 2所示。

表 2 动态内存管理模块API 函数功能列表

mem_init()

函数原型 void mem_init(void) 参数 无 返回值

功能说明 初始化动态内存区域,是以ram 为起始地址,长度为MEMSIZE words 的区域。 mem_malloc()

函数原型 void *mem_malloc(mem_size_t size) 参数 size 类型为无符号16位整数,值位需要申请的内存块的以字位单位的大小

返回值

返回一个无类型指针。成功则返回指向分配内存块的起始地址,失败则返回NULL

功能说明 在动态内存区域中寻找长度大于或等于size 的内存块,若存在则将内存块的前size 个

单元划分出来,交由调用函数使用 mem_free()

函数原型 void mem_free(void *mem) 参数 mem 需要释放内存块的首地址

返回值

功能说明标志位置为未使用,若前后有相邻的未使用的内存区域,则执

释放指定内存区域,将 行内存空洞合并操作mem_realloc()

函数原型 void *m lloc(void *mem, mem_size_t size) em_rea 参数 以字为单位)

mem

需要调整大小的内存块的首地址 size 需要调整到的大小(返回值

调整完毕后的内存区域的首地址

功能说明 址维持不便,也不进行copy 操作。

能将指定内存区域缩小,而无法增大 将mem 的长度缩小为size 指定的大小,mem 的首地此函数只mem_reallocm()

函数原型 em_rea _t size) void *m llocm(void *mem, mem_size 参数 以字为单位)

mem

需要释放内存块的首地址

size 需要调整到的大小(返回值

调整完毕后的内存区域的首地址

功能说明 配失败则调用mem_realloc()函数来处理,并返回mem_realloc()的返回值给调用者 本函数优先另外申请一段区域大小为size*word 的内存,然后copy 源区域数据前size

个word ,最后释放源区域。若在第一步分

3缓冲区(pbuf)管理模块

在unIP中,所有的数据包均采用同一种结构来封装,这就是pbuf。pbuf是一个链表,用来链接一个数据包的各个组成部分。pbuf结构的声明如下:

struct pbuf {

struct pdub *next;

// 有效数据的指针

void

*payload;

tot_len; // 整个pbuf链表的有效数据长度的总和,以byte为单位u16_t

// 本pbuf有效数据的长度,以byte为单位

len;

u16_t

// 本pbuf的类型

u16_t

flags;

ref; // 本pbuf的引用次数

u16_t

};

具体的pbuf类型分为如下三种:

z PBUF_ROM:对应flags为PBUF_FLAG_ROM。此类pbuf的payload指向一片ROM区域,多半用来保存不变的数据。比如,静态网页数据。此类pbuf的另一个特点是pbuf的大小

固定。

z PBUF_RAM:对应的flags为PBUF_FLAG_RAM。此类pbuf的payload指向RAM区域,在分配pbuf的时候会一并分配指定大小的RAM区域给payload指针。此类pbuf一般用来

存放动态生成的数据,比如,动态网页数据。

z PBUF_POOL:对应的flags为PBUF_FLAG_POOL。此类pbuf的payload也是指向RAM 区域,但是与PBUF_RAM不同的是,此类pbuf的大小是固定的。此类pbuf一般用于存放

链路层接收到的数据包。因为链路层的数据包长度会有一个不大的上限值,可以在编译期

即为其分配固定大小的pbuf。

下面来看本层提供的API函数,如表3所示。

表 3 缓冲区管理模块API函数功能列表

pbuf_init()

函数原型 void pbuf_init(void)

参数无

返回值无

功能说明初始化pbuf区域。必须在所有其他pbuf类函数运行前被调用

pbuf_alloc()

函数原型struct pbuf *pbuf_alloc(pbuf_layer l, u16_t size,pbuf_flag flag)

参数 l 枚举类型pbuf_layer,包含以下数值

传输层的packet

PBUF_TRANSPORT

PBUF_IP IP层的packet

链路层的packet

PBUF_LINK

PBUF_RAW

原始packet

申请的

size pbuf管理的数据区域的长度(以字节为单位)

flag pbuf类型。包括以下数值

L 数据区域在RAM 中且大小固定

PBUF_RAM 数据区域在RAM 中 PBUF_ROM 数据区域在ROM 中 PBUF_REF 用来引用其他的pbuf PBUF_POO 返回值

分配成功后的pbuf 指针

功能说明 别在于在payload 指针前预留了不同大小的空闲空间用处理 4 4 使用的是payload 之后的区域,大小是size 。 pbuf_layer 的四种枚举类型的区来不同层的数据包头: 传输层 20+20+1 网络层 20+1 链路层 14 原始型 0

用户pbuf_realloc()

函数原型 pbuf_reallo voi c(struct pbuf *p, u16_t size) d 参数pbuf

p

准备调整的类型指针size 准备调整到的新长度(指数据长度)

返回值

功能说明 :P1->P2->P3

整了数据的长度,使得P3中的数据没有用到,则通过调整P1的total_len ,然主要是用来除去在分配了不必要的pbuf 链的没有用到的单元

例如,实现分配了一个pbuf 链后来调后调用本函数,即可回收P3 pbuf_heade

r()函数原型 u8_t pbuf_header(struct pbuf *p, s16_t header_size) 参数 p 目标pbuf 指针

header_size header 头的大小(以字节为单位) 返回值

成功返回0,失败返回1

功能说明 指针,是payload 指向原来payload+header_size 的位置。

容,常用

奇数)会返回0并保持原来的payload 不变 调整pbuf 的payload 当header_size 为正数的时候,是将payload 增加,从数据包中去除一部分数据,常用于用于拆包。当header_size 为负数的时候,是将payload 减少,以向数据包中增加一些内于封包。对于非法header_size(超范围或pbuf_ref()

函数原型 uf_ref(struct pbuf *p) void pb 参数 p 目标pbuf 指针

返回值

功能说明 将目标pbuf 的ref 域加1。意味着被引用次数加一。只有ref 域为0时pbuf 才能被释放pbuf_ref_chain()

函数原型 d pbuf_ref_ch voi ain(struct pbuf *p) 参数 p

目标pb 的首指针

uf 链

返回值 无功能说明 将指向pbuf 链的所有pbuf 的域ref 加1 pbuf_free()

函数原型 pbuf *p) u8_t pbuf_free(struct 参数 p 目标pbuf 指针

返回值

该链表的单元总数

功能说明 将pbuf 链表中的所有单元的ref 域减一。若减至零,则释放该单元。

返回值为该链表的单元总数 pbuf_cat()

函数原型 , struct pbuf *t) void pbuf_cat(struct pbuf *h 参数 h pbuf 指针

t pbuf 指针 返回值

功能说明 将两个pbuf 链表连接成为一个新的pbuf 。新的多用于同层的数据的联合。按照pbuf_free 的算pbuf 所包含的数据时二者的顺序联合

法,t 与h 会一同被释放掉 pbuf chain _()

函数原型 uf_chain(struct pbuf *h, struct pbuf *t) void pb 参数 h pbuf 指针

t pbuf 指针 返回值

功能说明 时二者的顺序联合,

外t 的ref 域会被加一

为底层的pbuf ,而t 为高层的pbuf 。按照pbuf_free 的,t 不会同 将两个pbuf 链表连接成为一个新的pbuf 。新的pbuf 所包含的数据此多用于不同层的数据的联合。h 算法h 一起被释放掉,正好符合分层处理的原则。pbuf_clen()

函数原型 u8_t pbuf_clen(struct pbuf *p) 参数 p 目标pbuf 链的首指针

返回值 无

功能说明 返回值为该链表的单元总数

4UDP层API函数说明

unIP提供了UDP层的API函数,用户可以用其来编写客户端和服务器端的应用程序,例如TFTP 以及DNS Client和DHCP Client。本层API的函数详细说明如表4所示。

表 4 UDP层API函数功能列表

udp_init()

函数原型 udp_init()

参数无

返回值无

功能说明本函数初始化UDP层相关的数据结构

udp_new()

函数原型 struct udp_pcb *udp_new(void)

参数无

返回值 UDP协议控制块指针,若无空闲协议控制块,则返回NULL

UDP协议控制块的个数,可由UDP_NUM设定

功能说明新建一个UDP协议控制块。新建一个连接之前调用此函数获取一个可用的协议控制块。udp_remove()

函数原型void udp_remove(struct udp_pcb *pcb)

参数 pcb UDP协议控制块指针

返回值无

功能说明删除并释放该udp控制块

udp_bind()

函数原型err_t udp_bind(struct udp_pcb *pcb, struct ip_addr *ipaddr, u16_t port)

参数 pcb UDP协议控制块需要绑定的协议控制块

ipaddr 绑定到本机的IP地址,与某个网络接口匹配。若为IP_ADDR_ANY,

则是绑定到本地的所有网络接口

port 绑定到本地的端口,若为0则表示可随机选取一个端口

返回值成功返回ERR_OK,否则返回错误代码。如ERR_USE表示无可用端口

功能说明将udp协议控制块绑定到本地ip地址以及port端口号

udp_connect()

函数原型err_t udp_connect(struct udp_pcb *pcb, struct ip_addr *ipaddr, u16_t port)

参数 pcb UDP协议控制块,需要链接的协议控制块

host的ip地址

ipaddr remote

host的端口号

port remote

返回值目前一定返回ERR_OK

功能说明本函数并不发起实际的网络通信,只是将pcb的remote ip和remote port设定为参数值udp_send()

函数原型err_t udp_send(struct udp_pcb *pcb, struct pbuf *p)

参数 pcb UDP协议控制块指针

数据的pbuf 指针。此pbuf 应为传输层pbuf

p

存放需要发送的应用层返回值

一定返回目前ERR_OK

功能说明 UDP 层,最终由链路层送出到网络上。UDP 层发送数据就是

发送p 中所包含的数据到通过本函数进行的,入口参数p 必须申请为传输层pbuf ,否则会出错 示例

t nserver), PBUF_RAM); ruct ip_addr *)&nserv, NS_PORT); .…… //一系列初始化过程

p = pbuf_alloc(PBUF_TRANSPORT, sizeof(struc …… //填充p 的payload 域的数据 upcb = udp_new();

udp_connect(upcb, (st udp_send(npcb, p); pbuf_free(p);

udp_recv()

函数原型 viod udp_recv(struct udp_pcb *pcb,

void (*recv)(void *arg, struct udp_pcb *upcb,

struct pbuf *p,

struct ip_addr *addr, u16_t port),

void *recv_arg) 参数 pcb

UDP 协议控制块 recv 回调函数指针 recv_arg 回调参数

返回值

成功则返回ERR_OK ,否则返回错误码。如ERR_USE ,表示无可用端口

功能说明 设定回调函数指针recv ,以及回调参数recv_arg

该函数指针所指向的函数会在有新的udp 层数据到达的时候被调用 recv()

函数原型 void (*recv)(void *arg, struct udp_pcb *upcb, struct pbuf *p, struct ip_addr *addr, u16_t port) 参数 回调参数

制块指针 指针 r arg upcb UDP 协议控p 存放接收到的数据的pbuf add remote host 的ip 地址 port remote host 的端口号 返回值

通信 成功则返回ERR_OK ,继续这次UDP 否则可以返回错误码,以终止UDP 通信

功能说明 调用。新的数据就在p 中存放,addr 和port

本函数当udp 层有新的数据到来的时候会被为remote ip addr 和remote port 。udp 层的协议的接收处理部分就在此函数中进行。 利用UDP 层实现的应用层协议,主体部分一般在recv 函数中进行

5 TCP 层API 函数说明

unIP 具有完整的TCP 层的实现,利用本层提供的API 可以实现各种基于TCP 的应用层协议。本层API 的函数详细说明如表 5所示。

表 5 TCP 层API 函数功能列表

tcp_init()

函数原型 void tcp_init(void) 参数 无 返回值 无

功能说明 tcp 初始化函数,应该在所有的tcp 应用之前被调用

tcp_new()

函数原型 struct tcp_pcb *tcp_new(void) 参数 无

返回值

若成功则返回TCP 协议控制块指针

若无空闲TCP 协议控制块,则返回NULL 。系统可用TCP 协议控制块的个数,可以通过宏TCP_NUM 来配置 功能说明 新建一个TCP 协议控制块。新建一个连接之前调用此函数获取一个可用的协议控制块。

此函数给协议控制块默认优先级为TCP_PRIO_NORMAL = 64 tcp_alloc()

函数原型 struct tcp_pcb *tcp_alloc(u8_t prio) 参数 prio 协议控制块的优先级

返回值返则返回NULL 。系统可用的TCP 协议控制块的个数可以通

若成功则回TCP 协议控制块指针

若无空闲TCP 协议控制块,过宏TCP_NUM 来配置

功能说明 功能同tcp_new(),额外的功能是可以指定PCB 的优先级 tcp_arg()

函数原型 arg) void tcp_arg(struct tcp_pcb *pcb, void *参数 制块指针 回调参数

pcb

TCP 协议控arg 返回值

功能说明 确定的TCP 连接中使用的回调参数。该参数会在该PCB 块对应的回调

设置由PCB 所函数中被引用tcp_bind()

函数原型 t ip_addr *ipaddr, u16_t port) err_t tcp_bind(struct tcp_pcb *pcb, struc 参数 r 地端口。若为0则由协议栈随机选择一个端口

pcb

TCP 协议控制块指针

ipadd 需要绑定的本地网络接口的ip 地址

port 绑定的本返回值

成功则返回ERR_OK

出错可能返回ERR_USE ,表示端口已经被别的pcb 绑定

功能说明 ,则

由其他pcb 已经绑定该ip 以及port 口,则返回ERR_USE ,否则返回ERR_OK 将指定的pcb 绑定到本地的ip 地址和port 端口号。若ipaddr 若为IP_ADDR_ANY 是绑定到本地所有的ip 地址(当由多网络接口时,就是绑定到所有的接口) 若tcp_listen()

函数原型 _pcb *pcb) struct tcp_pcb *tcp_listen(struct tcp 参数 pcb TCP 协议控制块

返回值

成功则返回pcb 指针

功能说明 accept()请一个小一些的pcb 以供监听状态之用。若mem 过少,则可能返回NULL 将pcb 所指定的连接置于监听队列中。在此操作之前,必须已经执行完绑定动作。置

于监听队列后,若有客户端连接已经绑定的端口,则会调用接下来由函数tcp_所指定的回调函数,来服务该连接。此函数是用来实现TCP 服务器程序的。 由于处理listen 状态的tcp 协议控制块所需要的ram 较小,因此本函数将释放入口的pcb ,并另外申tcp_accept()

函数原型 void t cp_accept(struct ctp_pcb *pcb,

err_t(*accept)(void *arg, struct tcp_pcb *newpcb, err_t err) ); 参数pt 接受连接回调函数指针

pcb

TCP 协议控制块指针 acce 返回值

功能说明 当有client 连接到监听pcb 中的相应端口时,accept 所指向的函数将被调用 谁的那个接受连接回调函数

accept()

函数原型 (*accept)(v ruct tcp_pcb *newpcb, err_t err) err_t oid *arg, st 参数 cb 块 连接过程中的错误码

arg

回调参数

newp 维护此连接的协议控制err 返回值

错误码

功能说明 被调用。

受此连接。否则返回其他错误码,通知协议栈重置客户端连接(RST ) 回调函数(函数名称可以由程序员自己指定):当客户端发起连接请求时会此函数在tcp 连接由SYN_RECV 状态转到ESTABLISED 之间被调用。 应用层可在此函数中做一些初始化以及filter 的动作,若通过所有检查则返回ERR_OK ,通知协议栈接tcp_connect()

函数原型 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) ); 参数 pcb TCP 协议控制块指针

ipaddr remote host 的ip 地址 port remote host 的端口号 connected 连接建立回调函数指针返回值

操作成功返回ERR_OK ,否则返回错误码

功能说明 接被服务器接受,完成的,知道连接建立的时候,应用层才有机会在connected 函数中做一些操作。建立到服务器的一个连接。

并指定一个回调函数指针connected ,当连连接最终建立的时候,协议栈会自动调用该指针指向的函数。

本函数执行中会送出一个SYN ,并不会等服务器回应就立即返回,后续的动作是在协议栈中本函数执行成功后会返回ERR_OK ,若返回ERR_MEM 则表示没有RAM 来发送SYN 。本函数用来实现客户端对服务器端发起一次连接。 connected()

函数原型 err_t (*connected)(void *arg, struct tcp_pcb *tpcb, err_t err) 参数 arg 回调函数指针

tpcb TCP 协议控块指针 err 连接建立过程中的错误码 返回值

操作成功返回ERR_OK ,否则返回错误码

功能说明 回调函数(函数名称可以由程序员自己指定)服务器的SYN ACK 后会调用此函数 :收到此函数在tcp 由SYN Sent 状态转到ESTABLISED 之间被调用,让应用层可以处理一个代表了是否是一次正确的连接建立刚被服务器接受的一个连接。入口参数err tcp_write()

函数原型 err_t tcp_write(struct tcp_pcb *pcb, const void *dataptr, u16_t len, u8_t copy) 参数 ;1:copy 到协议栈内部发送 pcb TCP 协议控制块

dataptr 待发送数据首地址 len 待发送数据的长度(以字节为单位)

copy 0:不copy 到协议栈内部发送返回值

操作成功返回ERR_OK ,否则返回错误码

功能说明 该数据,多用于发送则表示数据成功插入发送队列中,否则表示插入失败,一般返回MEM 应用层传输TCP 数据函数

此函数一般在ESTABLISED 状态下调用。用来发送以dataptr 为首地址,长度为len(字节为单位)的数据。copy 为0表示不需要在协议栈内部copy 一份rom 或不会变动的静态数据。若是动态数据则copy 应该置为1

该函数返回ERR_OK ERR_tcp_sent()

函数原型 (struct tcp_pcb *pcb, err_t (*send)(void *arg, struct tcp_pcb *tpcb, u16_t len))void tcp_send 参数 pcb

TCP 协议控制块 sent 发送数据回调函数

返回值

功能说明 设定回调函数指针sent

函数指针sent 指向的函数将在tcp 层得知有新的数据被remote 端收到的时候被调用。用来继续发送应用层未发送完毕的数据 sent()

函数原型 err_t (*sent)(void *arg, struct tcp_pcb *tpcb, u16_t len) 参数 arg

回调参数tpcb TCP 协议控制块指针

len remote host 新接收到的数据长度,以字节为单位

返回值

操作成功返回ERR_OK ,让连接继续,否则返回错误码,使协议栈中止连接释放资源

功能说明 被调用。len 表示新被收到的字节数 此回调函数在remote host 收到新的数据后此函数用来续传应用层未发送完的数据tcp_recv()

函数原型 void tcp_recv(r_t (*recv)(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err) struct tcp_pcb *pcb,

er ) 参数 接收数据回调函数指针

pcb

TCP 协议控制块

recv 返回值 无

功能说明 设定回调函数recv 。该函数在收到新的数据时被调用

recv()

函数原型 *p, err_t err) err_t (*recv)(void *arg, struct tcp_pcb *tpcb, struct pbuf 参数 arg 回调参数

tpcb TCP 协议控制块指针 p 存放收到的数据的pbuf err 协议栈内部抛出的错误代码 返回值

操作成功返回ERR_OK ,让连接继续,否则返回错误码通知协议栈中止连接

功能说明 新的数据。应用层协议主体在本函数中实现,所有的应用层输入均来源于此函数中pbuf 指针p 。处理完毕后返回ERR_OK 表示继续连接,否则协笨回调函数用来接收数据议栈会终止连接 tcp_recved()

函数原型 tcp_recved void (struct tcp_pcb *pcb, u16_t len) 参数 pcb

TCP 协议控制块指针

len 应用层收到的数据长度,以字节为单位

返回值

功能说明 应用层来通知底层协议成功收到的字节数,在接收到新的数据后必须调用此函数,否

则窗口不会更新,将很快塞满而无法接收新的数据。 tcp_poll()

函数原型 _t (*poll)(void *arg, struct tcp_pcb *tpcb), u8_t

al) void tcp_poll(struct tcp_pcb *pcb, err interv 参数 制块指针 轮询回调函数指针 pcb

TCP 协议控poll interval 轮询周期

返回值 无

功能说明 设定一个周期调用的函数指针poll 。周期典型值为interval*0.5secs

poll()

函数原型 cb) err_t (*poll)(void *arg, struct tcp_pcb *tp 参数 arg

回调参数

tpcb TCP 协议控制块指针

返回值

功能说明 位于应用层的周期调用函数。当一次连接长期处于idle 状态时,此函数可以用来处理

一些事务,如超时断线回收资源等等 tcp_err()

函数原型 void tcp_err(struct tcp_pcb *pcb, void (*err)(void *arg, err_t err)) 参数 pcb

TCP 协议控制块指针 err 错误处理函数指针

返回值

功能说明 设定错误处理回调函数,当连接发生某些错误的时候会被调用,例如接收到RST 或者

中进行一些资源回收的吹了,因为此函数被调用意味连接马上被此时不回收一些资源将会造成资源泄漏 发出RST 等。用户应该在此函数着该删除,若err()

函数原型 void (*err)(void *arg, err_t err) 参数 ar er g

回调参数

r 协议栈抛出的错误编码返回值 无

功能说明

错误处理函数。当连接发生某些错误的时候会被调用tcp_close()

函数原型 err_t tcp_close(struct pcb_pcb *pcb) 参数 块

pcb TCP 协议控制返回值

操作成功返回ERR_OK ,否则返回错误码 功能说明 关闭连接。该函数执行成功后会发出FIN 到remote host ,并释放pcb ,返回ERR_OK 。

负责处理这种情形,例如可以轮询一直到返回成功,就没有成功关闭该连接 佛足额返回ERR_MEM ,程序员要否则tcp_abort()

函数原型 void tcp_abort(struct tcp_pcb *pcb) 参数 控制块

pcb TCP 协议返回值

功能说明 中止连接。当发现状态出错的时候,或者重试一定次数都无法恢复的时候,就执行此

终止连接。此函数执行成功后会发送RST 到remote host 。此函数执行到最后会调误处理回调函数 函数用错tcp_tmr()

函数原型 void tcp_tmr(void) 参数 无 返回值 无

功能说明 tcp 节拍函数,应该保证每200ms 调用一次本函数

6 网络字节辅助函数API

由于网络字节序是big endian ,而unSP 单片机为little endian ,所以在从网络字节流中获取数据以及送数据到网络链路中去的时候都要做一下转换。另外,unSP 单片机是16位的word 数据,而网络链路中是8位的byte 数据,因此也不能直接取数。本层提供的API 就是用于处理上述情况。函数的详细说明如表 6所示。

表 6 网络字节辅助API 函数功能列表

htons()

函数原型 u16_t htons(u16_t n) 参数 n 16bit 数据

返回值 16bit 数据

功能说明 将本地数据转换为网络字节序(高低8bit 互换) ntohs()

函数原型 u16_t ntohs(u16_t n) 参数 n 16bit 数据

返回值 16bit 数据

功能说明 将网络字节序转换为本地字节序(高低8bit 互换) htonl()

函数原型 u32_t htonl(u32_t n) 参数 n 32bit 数据

返回值 32bit 数据

功能说明互换)执行完毕后m = 0x78563412 将本地数据转换为网络字节序(高低8bit

例:

; n = 0x12345678m = htons(n);

ntohl()

函数原型 u32_t hotnl(u32_t n) 参数 n 32bit 数据

返回值 32bit 数据

功能说明 将网络字节序转换为本地字节序(高低8bit 互换) getbyte()

函数原型 etbyte(u1t) u8_t g 6_t *data, u16_t offse 参数 字节对应的偏移(字节为单位)

data

缓冲区首地址指针

offset 需要提取的返回值 相应位置处的8bit 数据

功能说明 从以缓冲区为首地址,偏移量为offset 个字节的位置处,去除该byte 数据

putbyte()

函数原型 utbyte(u16_t offset)

void p 6_t *data, u8_t ch, u1

参数

针 et 需要写入字节对应的偏移(字节为单位)

data 缓冲区首地址指ch 待写入的数据

offs 返回值

功能说明 从以缓冲区为首地址,偏移量为offset 个字节的位置处,写入数据ch pachstrncat()

函数原型 ckstrnc str, u16_t offset) u16_t pa at(u16_t *data, char *参数

末端偏移量

data 缓冲区首地址指针

str 待加入的非压缩型字符串首地址 offset 待加入的data 缓冲区的返回值

操作完成后新的data 的末端偏移量

功能说明 新的压缩型字符串。str 必须以’0\’结束,’0\’并不会data 缓冲区的末尾 从以缓冲区data 为首地址,偏移量为offset 个字节的位置处,将非压缩型字符串str 中

的字符全部写入data 中,得到一个被写入lwip time _out()

函数原型 id) u16_t lwip _timeout(vo 参数

返回值 lwip bit3 DHCP COARSE 时钟超时

超时事件标志

bit0 tcp 超时 bit1 ARP 超时 bit2 DHCP FINE 时钟超时 功能说明 通过调用unIP ,得知某超时事件发生,然后执行相应操作。

相关文档