【lwIP(第十一章)】UDP协议

文章详细介绍了UDP协议的报文结构,包括源端口号、目的端口号、长度和校验和。接着讨论了UDP数据的传递流程,以及lwIP内核如何使用UDP控制块来接收数据。每个控制块包含接收回调函数和端口号,lwIP内核通过遍历控制块链表匹配端口来处理数据包。此外,文章还提及了RAW接口在UDP编程中的作用及其连接流程。
摘要由CSDN通过智能技术生成

一、UDP协议报文结构

在这里插入图片描述

PACK_STRUCT_BEGIN 
struct udp_hdr 
{ 
	PACK_STRUCT_FIELD(u16_t src); 		/* 源端口号 */ 
	PACK_STRUCT_FIELD(u16_t dest); 	/* 目的端口号 */ 
	PACK_STRUCT_FIELD(u16_t len); 		/* UDP长度 */ 	PACK_STRUCT_FIELD(u16_t chksum); 	/* 校验和 */ 
} PACK_STRUCT_STRUCT; 
PACK_STRUCT_END

二、UDP数据递交流程

在这里插入图片描述


三、UDP控制块结构

接收数据时,lwIP内核把数据递交给UDP控制块recv函数指针指向的函数

在这里插入图片描述

struct udp_pcb 
{ 
	IP_PCB; 							/* 通用IP控制块 */ 
	struct udp_pcb *next; 				/* 下一节点的指针,用于构成控制块链表 */ 
	u8_t flags; 						/* 控制块状态 */ 
	u16_t local_port, remote_port; 		/* 本地端口号、远程端口号 */ 
	udp_recv_fn recv; 					/* 处理网络接收数据的回调 */ 
	void *recv_arg; 					/* 用户自定义参数,接收回调入参 */ 
};

四、UDP控制块原理

链接: 多个UDP控制块构建一个单向的链表

函数: 每一个控制块都管理一个接收回调函数

端口: lwIP内核根据端口号查找控制块

描述: 每一个控制块用来描述各自网络的信息

在这里插入图片描述
在UDP编程中,无论是那种接口,它们都是对UDP控制块进行操作


dup_pcb链表挂载多个控制块,数据包递交给“谁”处理?
遍历udp_pcbs链表,检查其中的本地端口号与报文首部中的目的端口号是否匹配,并递交给匹配成功的控制块处理


五、RAW接口简介

在这里插入图片描述
在这里插入图片描述


RAW接口UDP函数
在这里插入图片描述


六、RAW接口的UDP连接流程

在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
lwIP 中,发送 UDP 数据包的基本步骤如下: 1. 创建一个 `struct udp_pcb` 对象,用于表示 UDP 协议控制块,通过调用 `udp_new()` 函数来实现。 2. 通过调用 `udp_bind()` 函数将 `struct udp_pcb` 对象与一个本地端口号绑定,以便接收 UDP 数据包。 3. 通过调用 `udp_connect()` 函数将 `struct udp_pcb` 对象与目标 IP 地址以及目标端口号连接起来,以便发送 UDP 数据包。 4. 创建一个 `struct pbuf` 对象,用于存储待发送的数据,可以通过调用 `pbuf_alloc()` 函数来实现。 5. 调用 `udp_sendto()` 函数将数据包发送给指定的目标地址,如果发送成功,函数将返回发送的数据大小;否则,返回值为负数,表示发送失败。 6. 在不需要发送 UDP 数据包时,需要通过调用 `udp_disconnect()` 和 `udp_remove()` 函数分别关闭连接并释放资源。 下面是一个示例代码,用于发送 UDP 数据包: ```c struct udp_pcb *pcb; struct pbuf *p; ip_addr_t remote_ip; uint16_t remote_port; /* 创建 UDP 协议控制块 */ pcb = udp_new(); /* 绑定本地端口号 */ udp_bind(pcb, IP_ADDR_ANY, 1234); /* 连接目标地址和端口号 */ IP4_ADDR(&remote_ip, 192, 168, 1, 100); remote_port = 5678; udp_connect(pcb, &remote_ip, remote_port); /* 创建数据包 */ p = pbuf_alloc(PBUF_TRANSPORT, sizeof("Hello, world!"), PBUF_RAM); memcpy(p->payload, "Hello, world!", sizeof("Hello, world!")); /* 发送数据包 */ udp_sendto(pcb, p, &remote_ip, remote_port); /* 释放资源 */ udp_disconnect(pcb); udp_remove(pcb); pbuf_free(p); ``` 在实际使用中,还需要考虑网络连接的可靠性、数据包的顺序以及重传机制等问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Eiker_3169

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值