0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

基于RAW API的UDP客戶端設計

CHANBAEK ? 來源:木南創(chuàng)智 ? 作者:尹家軍 ? 2022-12-14 14:59 ? 次閱讀

前一節(jié)我們實現(xiàn)了基于RAW API的UDP服務器,在接下來,我們進一步利用RAW API實現(xiàn)UDP客戶端。

1 、 UDP****協(xié)議簡述

UDP協(xié)議全稱是用戶數(shù)據(jù)報協(xié)議,在網(wǎng)絡中它與TCP協(xié)議一樣用于處理數(shù)據(jù)包,是一種無連接的協(xié)議。在OSI模型中,處于傳輸層,是IP協(xié)議的上層協(xié)議。UDP有不提供數(shù)據(jù)包分組、組裝和不能對數(shù)據(jù)包進行排序的缺點,也就是說,當報文發(fā)送之后,是無法得知其是否安全完整到達的。

UDP協(xié)議的主要作用是將網(wǎng)絡數(shù)據(jù)流量壓縮成數(shù)據(jù)包的形式。一個典型的數(shù)據(jù)包就是一個二進制數(shù)據(jù)的傳輸單位。每一個數(shù)據(jù)包的前8個字節(jié)用來包含報頭信息,剩余字節(jié)則用來包含具體的傳輸數(shù)據(jù)。

UDP報頭由4個域組成,其中每個域各占用2個字節(jié),具體如下:源端口號、目標端口號、數(shù)據(jù)報長度、校驗值。其數(shù)據(jù)結構如下:

UDP協(xié)議使用端口號為不同的應用保留其各自的數(shù)據(jù)傳輸通道。UDP和TCP協(xié)議正是采用這一機制實現(xiàn)對同一時刻內多項應用同時發(fā)送和接收數(shù)據(jù)的支持。數(shù)據(jù)發(fā)送一方(可以是客戶端或服務器端)將UDP數(shù)據(jù)包通過源端口發(fā)送出去,而數(shù)據(jù)接收一方則通過目標端口接收數(shù)據(jù)。有的網(wǎng)絡應用只能使用預先為其預留或注冊的靜態(tài)端口;而另外一些網(wǎng)絡應用則可以使用未被注冊的動態(tài)端口。因為UDP報頭使用兩個字節(jié)存放端口號,所以端口號的有效范圍是從0到65535。一般來說,大于49151的端口號都代表動態(tài)端口。

數(shù)據(jù)報的長度是指包括報頭和數(shù)據(jù)部分在內的總字節(jié)數(shù)。因為報頭的長度是固定的,所以該域主要被用來計算可變長度的數(shù)據(jù)部分。數(shù)據(jù)報的最大長度根據(jù)操作環(huán)境的不同而各異。從理論上說,包含報頭在內的數(shù)據(jù)報的最大長度為65535字節(jié)。不過,一些實際應用往往會限制數(shù)據(jù)報的大小,有時會降低到8192字節(jié)。

UDP協(xié)議使用報頭中的校驗值來保證數(shù)據(jù)的安全。校驗值首先在數(shù)據(jù)發(fā)送方通過特殊的算法計算得出,在傳遞到接收方之后,還需要再重新計算。如果某個數(shù)據(jù)報在傳輸過程中被第三方篡改或者由于線路噪音等原因受到損壞,發(fā)送和接收方的校驗計算值將不會相符,由此UDP協(xié)議可以檢測是否出錯。

2 、 UDP****客戶端設計

前面我們簡要的介紹了UDP協(xié)議及其數(shù)據(jù)報,接下來我們將考慮怎么實現(xiàn)基于UDP協(xié)議的客戶端。

首先,我們來看一看與UDP相關的API函數(shù),并對它們作一個初步的介紹,應為我們需要使用它們來實現(xiàn)我們的應用。函數(shù)及說明如下:

我們已經(jīng)了解了UDP服務器的實現(xiàn)步驟,接下來我們說明一下UDP客戶端的實現(xiàn)步驟。

首先,依然是創(chuàng)建一個新的UDP控制塊。

接下來,建立與服務器的連接,配置包括服務器的地址、端口等信息。

接下來,如果連接無問題,則注冊客戶端回調函數(shù)。與服務器端的實現(xiàn)一樣,其復雜程度與需要實現(xiàn)的功能相關。我們只是實現(xiàn)一個簡單UDP客戶端,所以我們向服務器發(fā)送固定的信息,收到回復后繼續(xù)發(fā)送對應的信息。

最后,由于客戶端是對話的發(fā)起方,所以在注冊完回調函數(shù)后,客戶端要發(fā)起首次對話。

3 、 UDP****客戶端實現(xiàn)

對UDP服務器端的實現(xiàn),我們依然將器分為兩方面內容:一是,UDP客戶端的初始化配置部分;二是,UDP客戶端的具體實現(xiàn)內容,也就是回調函數(shù)的內容。

首先實現(xiàn)UDP客戶端的初始化配置部分。定義新的UDP控制塊,連接到指定服務器的地址及端口,同樣由于我們的驗證比較簡單我們采用回環(huán)服務器端口。然后注冊回調函數(shù),發(fā)起客戶端首次通訊。具體代碼如下:

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   /* 創(chuàng)建一個新的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       /* 注冊回調函數(shù) */
23       udp_recv(upcb, UDPClientCallback, NULL);
24       /**數(shù)據(jù)發(fā)送,第一次連接時客戶端發(fā)送數(shù)據(jù)至服務器端,發(fā)送函數(shù)中會遍歷查找源IP地址的配置,如果源IP地址未配置,則數(shù)據(jù)發(fā)送失敗。該處出現(xiàn)的問題在后面總結中提到了**/
25       UdpClientSendPacket(upcb,data);  
26     }
27   }
28 }

其次實現(xiàn)UDP客戶端的具體實現(xiàn)內容。由于我們實現(xiàn)的簡單的響應客戶端,所以我們只是給服務器回復相同的內容。

1 /* 定義UDP客戶端數(shù)據(jù)處理回調函數(shù) */
 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);     //數(shù)據(jù)回顯
 5  
 6   pbuf_free(p);
 7 }
 8  
 9 /* 客戶端數(shù)據(jù)發(fā)送函數(shù) */
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     /* 復制數(shù)據(jù)到pbuf */
21     pbuf_take(p, (char*)data, strlen((char*)data));
22  
23     /* 發(fā)送數(shù)據(jù) */
24     udp_send(upcb, p);     //發(fā)送數(shù)據(jù)
25  
26     /* 釋放pbuf */
27     pbuf_free(p);
28   }
29 }

當然,如果我們不想人云亦云的回復服務器,則可以編輯我們自己的數(shù)據(jù)包然后發(fā)送回去。所以我們想要實現(xiàn)復雜的應用時,只需要重新編寫合適的回調函數(shù)就可以了!

4 、結論

我們完成了簡單的,基于RAW API的UDP客戶端,其本身并不復雜。同樣的我們使用網(wǎng)絡軟件測試其功能,我們在電腦上建立一個服務器端,然后通過我們這個客戶端去連接它。能夠進行連接并發(fā)送接受數(shù)據(jù),說明我們這個客戶端的設計是符合要求的。

至此我們完成了UDP客戶端及服務器的實現(xiàn),后續(xù)我們將在次基礎上實現(xiàn)更為復雜的應用。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • API
    API
    +關注

    關注

    2

    文章

    1472

    瀏覽量

    61749
  • UDP
    UDP
    +關注

    關注

    0

    文章

    322

    瀏覽量

    33849
  • 客戶端
    +關注

    關注

    1

    文章

    289

    瀏覽量

    16640
  • RAW
    RAW
    +關注

    關注

    0

    文章

    21

    瀏覽量

    3785
收藏 人收藏

    評論

    相關推薦

    請問如何獲取遠程客戶端的IP和端口號進行UDP廣播?

    Gor UDP廣播,我們應該如何知道消息是從哪里接收的?要實現(xiàn) recvfrom 函數(shù),我們需要知道客戶端的 IP 地址和端口號。您能建議可以使用 SDK 中的哪個 API 嗎?謝謝。
    發(fā)表于 07-16 08:02

    請教網(wǎng)絡傳輸中的奇怪問題:UDP傳輸有問題、TCP客戶端傳輸可行。

    STM32F407開發(fā)板上運行《網(wǎng)絡實驗4 RAW_TCP客戶端實驗》。3.在電腦上PING開發(fā)板,PING通。4.在電腦上運行《網(wǎng)絡助手》,發(fā)送的數(shù)據(jù),STM32F407開發(fā)板收到。STM32F407
    發(fā)表于 11-05 08:42

    TCPIP_UDP_Bind()阻止udp客戶端發(fā)送UDP數(shù)據(jù)包

    LoalAlxPoT上向上述客戶端發(fā)送數(shù)據(jù)時,客戶端將數(shù)據(jù)發(fā)送到遠程設備。為什么客戶端設備在使用本地綁定時需要一個初始觸發(fā)器?我在這里做錯了什么?任何幫助將不勝感激! 以上來自于百度翻譯 以下為原文 case
    發(fā)表于 03-13 07:15

    請問ESP8266的UDP到底區(qū)不區(qū)分服務器和客戶端

    最近在用精英板做ATK-ESP8266模塊的實驗,看到:AT指令使用實例.pdf里說UDP傳輸不區(qū)分server或者client,而提供的例程里UDP測試也只是說UDP測試與TCP客戶端
    發(fā)表于 07-12 04:35

    如何獲取連接的UDP客戶端的遠程MAC地址Harmony 1.09

    你好!我有兩個UDP服務器在運行,并且想從TCP UDP堆棧中讀出連接的客戶端的遠程MAC地址。在MLA TCP堆棧中,使用UDPSocketInfo[_MYUDP_Socket1]、..remoteNode.MACAddr.v
    發(fā)表于 11-01 12:28

    請問RN1810是否可以同時激活UDP客戶端UDP服務器或TCP客戶端?

    。這已經(jīng)工作得很好了!在我的應用程序中,我將部分使用UDP客戶端UDP服務器,使用“UDP廣播”(在我的例子中是ip 192.168.0.255),在另一個項目中,我想使用
    發(fā)表于 05-01 12:53

    API怎么創(chuàng)建客戶端會話結構體?

    API創(chuàng)建客戶端會話結構體
    發(fā)表于 03-30 06:56

    如何使用Socket實現(xiàn)UDP客戶端?

    本教程介紹了如何利用socket 編程來實現(xiàn)一個 UDP 客戶端,與服務器進行通信。與開發(fā) TCP 客戶端一樣,我們先將 socket 編程的流程列出來,然后給出具體的實例。
    發(fā)表于 03-30 07:39

    LWIP的RAW API UDP通信過程是如何實現(xiàn)的

    LWIP的主要特性有哪些?LWIP的RAW API UDP通信過程是如何實現(xiàn)的?
    發(fā)表于 11-01 06:53

    CSDN博客客戶端源碼

    CSDN博客客戶端源碼CSDN博客客戶端源碼CSDN博客客戶端源碼
    發(fā)表于 11-18 10:22 ?1次下載

    JAVA教程之UDP客戶端模型

    JAVA教程之UDP客戶端模型,很好的JAVA的資料,快來學習吧
    發(fā)表于 04-11 17:28 ?4次下載

    TCP回響客戶端RAW API接口

    TCP回響客戶端例程(RAW API)
    的頭像 發(fā)表于 07-05 00:31 ?3892次閱讀
    TCP回響<b class='flag-5'>客戶端</b>:<b class='flag-5'>RAW</b> <b class='flag-5'>API</b>接口

    網(wǎng)絡調試和串口調試集合UDP TCP客戶端和TCP服務器應用程序免費下載

    本文檔的主要內容詳細介紹的是網(wǎng)絡調試和串口調試集合UDP TCP客戶端和TCP服務器應用程序免費下載。
    發(fā)表于 08-30 08:00 ?16次下載
    網(wǎng)絡調試和串口調試集合<b class='flag-5'>UDP</b> TCP<b class='flag-5'>客戶端</b>和TCP服務器<b class='flag-5'>端</b>應用程序免費下載

    基于RAW APIUDP服務器設計

    前面我們已經(jīng)完成了LwIP協(xié)議棧基于邏輯的基本移植,在這一節(jié)我們將以RAW API來實現(xiàn)UDP服務器。
    的頭像 發(fā)表于 12-14 14:56 ?1074次閱讀
    基于<b class='flag-5'>RAW</b> <b class='flag-5'>API</b>的<b class='flag-5'>UDP</b>服務器設計

    基于LwIP的TCP客戶端設計

    上一篇我們基于LwIP協(xié)議棧的RAW API實現(xiàn)了一個TCP服務器的簡單應用,接下來一節(jié)我們來實現(xiàn)一個TCP客戶端的簡單應用。
    的頭像 發(fā)表于 12-14 15:12 ?2222次閱讀
    基于LwIP的TCP<b class='flag-5'>客戶端</b>設計