lwIP基本栈接口层(udp部分、pbuf结构)
相对于tcp协议,udp协议的处理过程容易很多。udp协议涉及到函数都要用到udp的协议控制块“udp_tcp”。这和tcp协议控制块很相似,但是其成员却略有不同。
这个结构体就是udp协议控制块,用于管理其相关操作。这些成员都不需要我们手动修改(调用相关函数即可自动修改),但我们可以实时查看我们需要的变量。其成员不多,我们简单介绍一下。
“next”用来将每个协议控制块串联成一个控制块链表;
“local_ip”和“dest_ip”分别表示本地和远端机的ip地址;
“local_port”和“dest_port”分别表示本地和远端机的端口号;
“flags”标识所应用的udp校验策略,或者可以完全关闭udp校验和,或者使用recv函数udp简化版校验和只覆盖数据包的一部分;
“chksum_len”指出校验和计算数据段的长度;
“recv”和“recv_arg”用于指定在接收到数据包时所使用的函数及其参数。
在接口函数中还用到了网络接口的结构体“netif”,这里也简单介绍一下。
物理网络硬件的设备驱动是通过这样的结构体来管理的。下面简单介绍其成员:“next”全局链表指针;“name”用两个字符的名字按网络类系那个标识网络硬件接口;“num”用来区分相同类型的网络接口;“ip_addr”、“netmask”和“gw”分别表示本地机上ip地址、子网掩码和网关;“input”接收数据包时所调用的设备驱动程序的指针;“output”发送数据包时所调用的设备驱动程序的指针;“state”指针指向网络接口的设备驱动特定状态,由设备驱动来设置。
下面介绍接口函数
一、udp.c文件
1、void udp_input(struct pbuf *p, struct netif *inp)
说明:处理接收到的udp数据包。
参数:p数据包缓存区;inp网络接口。
2、err_t udp_send(struct udp_pcb *pcb, struct pbuf *p)
说明:发送udp包。这个函数直接调用udp_sendto()函数。
参数:pcb协议控制块;p数据包发送缓存区。
返回:ERR_OK发送成功;ERR_MEM发送溢出;ERR_RTE不能发送到指定ip;其它表示发送失败。
3、err_t udp_sendto(struct udp_pcb *pcb, struct pbuf *p,
struct ip_addr *dst_ip, u16_t dst_port)
struct ip_addr *dst_ip, u16_t dst_port)
说明:发送udp包到指定ip地址。
参数:pcb协议控制块;p数据包发送缓存区;dst_ip目的ip地址;dst_port目的端口号。
4、err_t udp_sendto_if(struct udp_pcb *pcb, struct pbuf *p,
struct ip_addr *dst_ip, u16_t dst_port, struct netif *netif)
struct ip_addr *dst_ip, u16_t dst_port, struct netif *netif)
说明:按照指定的网络接口和ip地址发送udp包。
参数:pcb协议控制块;p数据包发送缓存区;dest_ip目的ip地址;dst_port目的端口号,netif网络接口。
5、err_t udp_bind(struct udp_pcb *pcb, struct ip_addr *ipaddr, u16_t port)
说明:在协议控制块中绑定本地ip地址和本地端口号
参数:pcb协议控制块;ipaddr本地ip地址;port本地端口号。
返回:ERR_OK成功;ERR_USE已经被占用。
6、err_t udp_connect(struct udp_pcb *pcb, struct ip_addr *ipaddr, u16_t port)
说明:与远端udp主机建立连接。
参数:pcb所需连接的协议控制块;ipaddr远端ip地址;port远端端口号。
7、void udp_disconnect(struct udp_pcb *pcb)
说明:断开指定连接。
参数:pcb所需断开连接的协议控制块。
8、void 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 *rev_arg)
void (* recv)(void *arg, struct udp_pcb *upcb, struct pbuf *p,struct ip_addr *addr, u16_t port),void *rev_arg)
说明:设置接收到数据包时调用的回调函数及其参数。
参数:pcb协议控制块;recv回调函数名(地址);rev_arg回调函数参数。
这个函数直接修改pcb->recv和pcb->recv_arg的值。
9、void udp_remove(struct udp_pcb *pcb)
说明:删除指定udp协议控制块,从协议控制链表中删除并释放内存资源。
参数:pcb所要删除的协议控制块。
10、struct udp_pcb * udp_new(void)
说明:创建udp协议控制块,并不分配资源。
返回:协议控制块指针,指向NULL。
另外,在udp.h文件中还定义了两个宏用于读取和修改结构体中flags成员的。
#define udp_flags(pcb) ((pcb)->flags)// 读取flags值
#define udp_setflags(pcb, f) ((pcb)->flags = (f))//设置flags值
flags的值有三种,分别是:
#define UDP_FLAGS_NOCHKSUM 0x01U
#define UDP_FLAGS_UDPLITE 0x01U
#define UDP_FLAGS_CONNECTED 0x04U
注:lwIP仅实现了IP层大部分的基本功能,能够发送接收以及转发信息包,但是不能接受和发送IP分片包,也不能处理携带IP参数选项的信息包。不过对大多数的应用来说,这不会
引起任何问题。但是对于udp包,远端发送的数据如果较大的话也不能分片发送,要分成若干udp完整包逐个发送,否则lwIP无法接收到。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论