姓名 李泽浩 学号 21181214372 学院 广州研究院
转载自 https://blog.csdn.net/FPGADesigner/article/details/88748846
【嵌牛导读】本文是关于udp sendto函数的使用详解
【嵌牛鼻子】udp sendto使用详解
【嵌牛提问】udp sendto函数如何搭建和使用
【嵌牛正文】
上文从“UDP发送Hello World”的实例体会了lwIP的使用。在user_udp_init函数中我们按照“创建UDP PCB->绑定本地端口->连接远程主机”的顺序完成初始化,发送时使用send函数将数据发送至连接的主机。
事实上,udp_connect函数的作用只是设置PCB的远程地址,没有产生任何网络流量。lwIP在UDP通信中还有另一个发送函数udp_sendto,本文在上个例子的基础上稍作修改,体会其与udp_send的差别。
SDK程序设计
主要差别体现在user_udp.c文件中,其余文件代码基本相同。
#include "user_udp.h"
//---------------------------------------------------------
// 变量定义
//---------------------------------------------------------
struct udp_pcb *connected_pcb = NULL;
static struct pbuf *pbuf_to_be_sent = NULL;
char send_buff[14] = "Hello World!\r\n"; //待发送字符
struct ip_addr ipaddr;
static unsigned local_port = 7; //本地端口
static unsigned remote_port = 8080; //远程端口
//---------------------------------------------------------
// UDP连接初始化函数
//---------------------------------------------------------
int user_udp_init(void)
{
struct udp_pcb *pcb;
err_t err;
/* 创建UDP控制块 */
pcb = udp_new();
if (!pcb) {
xil_printf("Error Creating PCB.\r\n");
return -1;
}
/* 绑定本地端口 */
err = udp_bind(pcb, IP_ADDR_ANY, local_port);
if (err != ERR_OK) {
xil_printf("Unable to bind to port %d\r\n", local_port);
return -2;
}
/* 设置远程地址 */
IP4_ADDR(&ipaddr, 192, 168, 1, 100);
connected_pcb = pcb;
/* 申请pbuf资源 */
pbuf_to_be_sent = pbuf_alloc(PBUF_TRANSPORT, 14, PBUF_ROM);
memset(pbuf_to_be_sent->payload, 0, 14);
memcpy(pbuf_to_be_sent->payload, (u8 *)send_buff, 14);
return 0;
}
//---------------------------------------------------------
// UDP发送数据函数
//---------------------------------------------------------
void udp_printf(void)
{
err_t err;
struct udp_pcb *tpcb = connected_pcb;
if (!tpcb) {
xil_printf("error connect.\r\n");
}
/* 发送字符串 */
err = udp_sendto(tpcb, pbuf_to_be_sent, &ipaddr, remote_port);
if (err != ERR_OK) {
xil_printf("Error on udp send : %d\r\n", err);
return;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
初始化时,无需使用udp_connect函数进行连接,在发送时直接使用udp_sendto即可将数据发送到任何指定的地址。
测试与改良
网线连接开发板和电脑,将以太网的IPv4地址修改为udp_sendto函数中设置的地址。打开网络调试助手,选择UDP协议、IP地址和udp_sendto函数设置的端口号。下载程序,开发板和电脑完成连接。
测试结果与上例相同,表明udp_sendto函数正常工作。
本例程序针对上篇文章中提出的问题进行了改良。在UDP初始化时便申请pbuf存储要发送的数据,不进行释放,避免了在发送时不停的申请、释放导致效率降低。存储的数据较少且无需更改,因此将pbuf类型由PBUF_POOL改为PBUF_ROM。
————————————————
版权声明:本文为CSDN博主「FPGADesigner」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/FPGADesigner/article/details/88748846