0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于RAW API的UDP客户端设计

CHANBAEK 来源:木南创智 作者:尹家军 2022-12-14 14:59 次阅读

前一节我们实现了基于RAW API的UDP服务器,在接下来,我们进一步利用RAW API实现UDP客户端。

1 UDP****协议简述

UDP协议全称是用户数据报协议,在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议。在OSI模型中,处于传输层,是IP协议的上层协议。UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。

UDP协议的主要作用是将网络数据流量压缩成数据包的形式。一个典型的数据包就是一个二进制数据的传输单位。每一个数据包的前8个字节用来包含报头信息,剩余字节则用来包含具体的传输数据。

UDP报头由4个域组成,其中每个域各占用2个字节,具体如下:源端口号、目标端口号、数据报长度、校验值。其数据结构如下:

UDP协议使用端口号为不同的应用保留其各自的数据传输通道。UDP和TCP协议正是采用这一机制实现对同一时刻内多项应用同时发送和接收数据的支持。数据发送一方(可以是客户端或服务器端)将UDP数据包通过源端口发送出去,而数据接收一方则通过目标端口接收数据。有的网络应用只能使用预先为其预留或注册的静态端口;而另外一些网络应用则可以使用未被注册的动态端口。因为UDP报头使用两个字节存放端口号,所以端口号的有效范围是从0到65535。一般来说,大于49151的端口号都代表动态端口。

数据报的长度是指包括报头和数据部分在内的总字节数。因为报头的长度是固定的,所以该域主要被用来计算可变长度的数据部分。数据报的最大长度根据操作环境的不同而各异。从理论上说,包含报头在内的数据报的最大长度为65535字节。不过,一些实际应用往往会限制数据报的大小,有时会降低到8192字节。

UDP协议使用报头中的校验值来保证数据的安全。校验值首先在数据发送方通过特殊的算法计算得出,在传递到接收方之后,还需要再重新计算。如果某个数据报在传输过程中被第三方篡改或者由于线路噪音等原因受到损坏,发送和接收方的校验计算值将不会相符,由此UDP协议可以检测是否出错。

2 UDP****客户端设计

前面我们简要的介绍了UDP协议及其数据报,接下来我们将考虑怎么实现基于UDP协议的客户端。

首先,我们来看一看与UDP相关的API函数,并对它们作一个初步的介绍,应为我们需要使用它们来实现我们的应用。函数及说明如下:

我们已经了解了UDP服务器的实现步骤,接下来我们说明一下UDP客户端的实现步骤。

首先,依然是创建一个新的UDP控制块。

接下来,建立与服务器的连接,配置包括服务器的地址、端口等信息。

接下来,如果连接无问题,则注册客户端回调函数。与服务器端的实现一样,其复杂程度与需要实现的功能相关。我们只是实现一个简单UDP客户端,所以我们向服务器发送固定的信息,收到回复后继续发送对应的信息。

最后,由于客户端是对话的发起方,所以在注册完回调函数后,客户端要发起首次对话。

3 UDP****客户端实现

对UDP服务器端的实现,我们依然将器分为两方面内容:一是,UDP客户端的初始化配置部分;二是,UDP客户端的具体实现内容,也就是回调函数的内容。

首先实现UDP客户端的初始化配置部分。定义新的UDP控制块,连接到指定服务器的地址及端口,同样由于我们的验证比较简单我们采用回环服务器端口。然后注册回调函数,发起客户端首次通讯。具体代码如下:

1 /* UDP客户端初始化配置 */
 2 void UDP_Client_Initialization(void)
 3 {
 4   ip_addr_t DestIPaddr;
 5   err_t err;
 6   struct udp_pcb *upcb;
 7   char data[]="This is a Client.";
 8  
 9   /* 设置服务器端的IP地址 */
10   IP4_ADDR( &DestIPaddr,udpServerIP[0],udpServerIP[1],udpServerIP[2],udpServerIP[3]);
11  
12   /* 创建一个新的UDP控制块 */
13   upcb = udp_new();
14  
15   if (upcb!=NULL)
16   {
17     /* 服务器端地址、端口配置 */
18     err= udp_connect(upcb, &DestIPaddr, UDP_ECHO_SERVER_PORT);
19  
20     if (err == ERR_OK)
21     {
22       /* 注册回调函数 */
23       udp_recv(upcb, UDPClientCallback, NULL);
24       /**数据发送,第一次连接时客户端发送数据至服务器端,发送函数中会遍历查找源IP地址的配置,如果源IP地址未配置,则数据发送失败。该处出现的问题在后面总结中提到了**/
25       UdpClientSendPacket(upcb,data);  
26     }
27   }
28 }

其次实现UDP客户端的具体实现内容。由于我们实现的简单的响应客户端,所以我们只是给服务器回复相同的内容。

1 /* 定义UDP客户端数据处理回调函数 */
 2 static void UDPClientCallback(void *arg,struct udp_pcb *upcb,struct pbuf *p,const ip_addr_t *addr,u16_t port)
 3 {
 4   udp_send(upcb, p);     //数据回显
 5  
 6   pbuf_free(p);
 7 }
 8  
 9 /* 客户端数据发送函数 */
10 void UdpClientSendPacket(struct udp_pcb *upcb,char* data)
11 {
12   struct pbuf *p;
13  
14   /* 分配内存空间 */
15   p = pbuf_alloc(PBUF_TRANSPORT,strlen((char*)data), PBUF_POOL);
16  
17   if (p != NULL)
18   {
19  
20     /* 复制数据到pbuf */
21     pbuf_take(p, (char*)data, strlen((char*)data));
22  
23     /* 发送数据 */
24     udp_send(upcb, p);     //发送数据
25  
26     /* 释放pbuf */
27     pbuf_free(p);
28   }
29 }

当然,如果我们不想人云亦云的回复服务器,则可以编辑我们自己的数据包然后发送回去。所以我们想要实现复杂的应用时,只需要重新编写合适的回调函数就可以了!

4 、结论

我们完成了简单的,基于RAW API的UDP客户端,其本身并不复杂。同样的我们使用网络软件测试其功能,我们在电脑上建立一个服务器端,然后通过我们这个客户端去连接它。能够进行连接并发送接受数据,说明我们这个客户端的设计是符合要求的。

至此我们完成了UDP客户端及服务器的实现,后续我们将在次基础上实现更为复杂的应用。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • API
    API
    +关注

    关注

    2

    文章

    1382

    浏览量

    60991
  • UDP
    UDP
    +关注

    关注

    0

    文章

    311

    浏览量

    33618
  • 客户端
    +关注

    关注

    1

    文章

    282

    浏览量

    16339
  • RAW
    RAW
    +关注

    关注

    0

    文章

    20

    浏览量

    3748
收藏 人收藏

    评论

    相关推荐

    请教网络传输中的奇怪问题:UDP传输有问题、TCP客户端传输可行。

    STM32F407开发板上运行《网络实验4 RAW_TCP客户端实验》。3.在电脑上PING开发板,PING通。4.在电脑上运行《网络助手》,发送的数据,STM32F407开发板收到。STM32F407
    发表于 11-05 08:42

    TCPIP_UDP_Bind()阻止udp客户端发送UDP数据包

    LoalAlxPoT上向上述客户端发送数据时,客户端将数据发送到远程设备。为什么客户端设备在使用本地绑定时需要一个初始触发器?我在这里做错了什么?任何帮助将不胜感激! 以上来自于百度翻译 以下为原文 case
    发表于 03-13 07:15

    请问ESP8266的UDP到底区不区分服务器和客户端

    最近在用精英板做ATK-ESP8266模块的实验,看到:AT指令使用实例.pdf里说UDP传输不区分server或者client,而提供的例程里UDP测试也只是说UDP测试与TCP客户端
    发表于 07-12 04:35

    UDP客户端不能接收该怎么办?

    大家好,我在UDP发送和接收上工作,我可以打开一个套接字并发送远程主机可以接收的数据包。但是当远程主机发送包时,我的UDP客户端不能接收。UDP是准备工作不适合我。在
    发表于 08-02 13:49

    如何获取连接的UDP客户端的远程MAC地址Harmony 1.09

    你好!我有两个UDP服务器在运行,并且想从TCP UDP堆栈中读出连接的客户端的远程MAC地址。在MLA TCP堆栈中,使用UDPSocketInfo[_MYUDP_Socket1]、..remoteNode.MACAddr.v
    发表于 11-01 12:28

    请问RN1810是否可以同时激活UDP客户端UDP服务器或TCP客户端

    。这已经工作得很好了!在我的应用程序中,我将部分使用UDP客户端UDP服务器,使用“UDP广播”(在我的例子中是ip 192.168.0.255),在另一个项目中,我想使用
    发表于 05-01 12:53

    C6748 UDP客户端例程有没有支持第一次是本地发起的例程?

    现在创龙开发板提供的UDP例程,是基于创建一个DaemonNew 服务而实现,其第一次只能被动的接受客户端的消息,才支持对的IP与端口号;void NetOpenHook(){ // 创建一个
    发表于 05-22 09:55

    API怎么创建客户端会话结构体?

    API创建客户端会话结构体
    发表于 03-30 06:56

    如何使用Socket实现UDP客户端

    本教程介绍了如何利用socket 编程来实现一个 UDP 客户端,与服务器进行通信。与开发 TCP 客户端一样,我们先将 socket 编程的流程列出来,然后给出具体的实例。
    发表于 03-30 07:39

    LWIP的RAW API UDP通信过程是如何实现的

    LWIP的主要特性有哪些?LWIP的RAW API UDP通信过程是如何实现的?
    发表于 11-01 06:53

    如何在Pegasus Wi-Fi IoT智能家居套件上完成UDP客户端实验

    UDP客户端实验netcat简介netcat 是什么?netcat是一个非常强大的网络实用工具,可以用它来调试TCP/UDP应用程序;netcat 如何安装?Linux上可以使用发行版的包管理器安装
    发表于 08-03 10:33

    JAVA教程之UDP客户端模型

    JAVA教程之UDP客户端模型,很好的JAVA的资料,快来学习吧
    发表于 04-11 17:28 4次下载

    TCP回响客户端RAW API接口

    TCP回响客户端例程(RAW API)
    的头像 发表于 07-05 00:31 3618次阅读
    TCP回响<b class='flag-5'>客户端</b>:<b class='flag-5'>RAW</b> <b class='flag-5'>API</b>接口

    基于RAW APIUDP服务器设计

    前面我们已经完成了LwIP协议栈基于逻辑的基本移植,在这一节我们将以RAW API来实现UDP服务器。
    的头像 发表于 12-14 14:56 809次阅读
    基于<b class='flag-5'>RAW</b> <b class='flag-5'>API</b>的<b class='flag-5'>UDP</b>服务器设计

    基于LwIP的TCP客户端设计

    上一篇我们基于LwIP协议栈的RAW API实现了一个TCP服务器的简单应用,接下来一节我们来实现一个TCP客户端的简单应用。
    的头像 发表于 12-14 15:12 1746次阅读
    基于LwIP的TCP<b class='flag-5'>客户端</b>设计