嵌牛3

姓名 李泽浩 学号 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

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 姓名 李泽浩 学号 21181214372 学院 广州研究院 转载自 https://blog.csdn.net/...
    李泽浩阅读 318评论 0 0
  • 参考:lwIP Wiki | FANDOM powered by Wikia 参考:lwIP: Overview ...
    a_one_and_a_two阅读 3,276评论 0 1
  • 网络编程 一.楔子 你现在已经学会了写python代码,假如你写了两个python文件a.py和b.py,分别去运...
    go以恒阅读 2,228评论 0 6
  • 基本的局域网聊天 局域网聊天TCP服务端: 运行下面代码 #include #include #include #...
    马小瑄阅读 1,067评论 0 0
  • 套接字地址结构 ipv4套接字地址结构 POSIX定义如下: sin_len字段,是由处理来自不同协议族的套接字地...
    FengyunSky阅读 742评论 0 1

友情链接更多精彩内容