LWIP UDP 协议分析

简介: 一、udp.c实现的函数1、void udp_input(struct pbuf *p, struct netif *inp)说明:处理接收到的udp数据包。参数:p数据包缓存区;inp网络接口。

一、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)

说明:发送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)

说明:按照指定的网络接口和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)

说明:设置接收到数据包时调用的回调函数及其参数。

参数: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 functions

err_t udp_bind(struct udp_pcb *pcb, struct ip_addr *ipaddr, u16_t port)
函数遍历整个UDP PCB链表,以排除在没有设置REUSE_ADDR或者REUSE_PORT标志的情况下绑定到一个以相同port绑定的pcb或者以相同port及ip绑定的pcb。如果需要绑定的port无效,则分配最小可用port。如果该pcb未在原来PCB链表中,则加入链表。具体流程参看流程图。
err_t udp_connect(struct udp_pcb *pcb, struct ip_addr *ipaddr, u16_t port)
连接到远程端口。如果还未分配本地port,则分配一个空闲port。然后将一下两种地址绑定类型进行转换:
a. *.local_port  foreign_ip.foreign_port: 调用ip_router确定本地ip。
b. *.*  *.foreign_port: 转换为 *.local_port  *.foreign_port

err_t udp_sendto(struct udp_pcb *pcb, struct pbuf *p,
struct ip_addr *dst_ip, u16_t dst_port)

该函数借用当前的pcb调用udp_send发送UDP包,完成后,回复原来pcb内容。

err_t udp_send(struct udp_pcb *pcb, struct pbuf *p)
如果pcb未绑定,则调用udp_bind获取一个可用的port绑定之。然后构造UDP包,查找能够到达remote_ip的router接口,如果有必要,将该接口的本地ip作为UDP的src ip。如果UDP需要校验和,则调用inet_chksum_pseudo函数,计算校验和。最后调用ip_output_if将UDP包传送到下层IP层发送。

void udp_input(struct pbuf *p, struct netif *inp)
该函数接受来自ip层的UDP包。将所有PCB都遍历,如果有多个绑定,则给每一个进程复制一份数据报,实际调用pcb->recv()。
其中的数据报的地址绑定匹配优先级和协议上的略有区别:
    Local                            Foreign
local_ip(*).local_port  foreign_ip(*).foreign_port
local_ip(*).local_port  *.*
相关文章
|
14天前
|
存储 网络协议 算法
UDP 协议和 TCP 协议
本文介绍了UDP和TCP协议的基本结构与特性。UDP协议具有简单的报文结构,包括报头和载荷,报头由源端口、目的端口、报文长度和校验和组成。UDP使用CRC校验和来检测传输错误。相比之下,TCP协议提供更可靠的传输服务,其结构复杂,包含序列号、确认序号和标志位等字段。TCP通过确认应答和超时重传来保证数据传输的可靠性,并采用三次握手建立连接,四次挥手断开连接,确保通信的稳定性和完整性。
46 1
UDP 协议和 TCP 协议
|
3月前
|
存储 网络协议 Ubuntu
【Linux开发实战指南】基于UDP协议的即时聊天室:快速构建登陆、聊天与退出功能
UDP 是一种无连接的、不可靠的传输层协议,位于IP协议之上。它提供了最基本的数据传输服务,不保证数据包的顺序、可靠到达或无重复。与TCP(传输控制协议)相比,UDP具有较低的传输延迟,因为省去了建立连接和确认接收等过程,适用于对实时性要求较高、但能容忍一定数据丢失的场景,如在线视频、语音通话、DNS查询等。 链表 链表是一种动态数据结构,用于存储一系列元素(节点),每个节点包含数据字段和指向下一个节点的引用(指针)。链表分为单向链表、双向链表和循环链表等类型。与数组相比,链表在插入和删除操作上更为高效,因为它不需要移动元素,只需修改节点间的指针即可。但访问链表中的元素不如数组直接,通常需要从
195 2
|
12天前
|
监控 网络协议 网络性能优化
如何办理支持UDP协议的网络
在当今网络环境中,UDP(用户数据报协议)因传输速度快、延迟低而广泛应用于在线游戏、视频流媒体、VoIP等实时服务。本文详细介绍了办理支持UDP协议网络的方法,包括了解UDP应用场景、选择合适的ISP及网络套餐、购买支持UDP的设备并进行优化设置,以及解决常见问题的策略,帮助用户确保网络稳定性和速度满足实际需求。
|
22天前
|
网络协议
UDP协议在网络通信中的独特应用与优势
UDP(用户数据报协议)作为关键的传输层协议,在网络通信中展现出独特优势。本文探讨UDP的无连接性及低开销特性,使其在实时性要求高的场景如视频流、在线游戏中表现优异;其不保证可靠交付的特性赋予应用程序自定义传输策略的灵活性;面向报文的高效处理能力及短小的包头设计进一步提升了数据传输效率。总之,UDP适用于高速、实时性强且对可靠性要求不高的应用场景,为网络通信提供了多样化的选择。
|
1月前
|
网络协议 视频直播 C语言
C语言 网络编程(三)UDP 协议
UDP(用户数据报协议)是一种无需建立连接的通信协议,适用于高效率的数据传输,但不保证数据的可靠性。其特点是无连接、尽力交付且面向报文,具备较高的实时性。UDP广泛应用于视频会议、实时多媒体通信、直播及DNS查询等场景,并被许多即时通讯软件和服务(如MSN/QQ/Skype、流媒体、VoIP等)采用进行实时数据传输。UDP报文由首部和数据部分组成,首部包含源端口、目的端口、长度和校验和字段。相比TCP,UDP具有更高的传输效率和更低的资源消耗。
|
22天前
|
网络协议
UDP 协议
UDP 协议
27 0
|
2月前
|
网络协议 视频直播 SDN
计算机网络:TCP协议的三次握手和四次挥手与UDP协议区别.
计算机网络:TCP协议的三次握手和四次挥手与UDP协议区别.
42 1
|
2月前
|
域名解析 网络协议 Linux
在Linux中,我们都知道,dns采用了tcp协议,又采用了udp协议,什么时候采用tcp协议?什么 时候采用udp协议?为什么要这么设计?
在Linux中,我们都知道,dns采用了tcp协议,又采用了udp协议,什么时候采用tcp协议?什么 时候采用udp协议?为什么要这么设计?
|
2月前
|
网络协议
计算机网络:TCP协议的三次握手和四次挥手与UDP协议区别.
计算机网络:TCP协议的三次握手和四次挥手与UDP协议区别.
45 0
|
2月前
|
域名解析 网络协议 物联网