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

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于RAW API的UDP客戶端設(shè)計(jì)

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

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

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

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

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

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

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

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

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

2 、 UDP****客戶端設(shè)計(jì)

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

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

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

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

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

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

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

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

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

首先實(shí)現(xiàn)UDP客戶端的初始化配置部分。定義新的UDP控制塊,連接到指定服務(wù)器的地址及端口,同樣由于我們的驗(yàn)證比較簡單我們采用回環(huán)服務(wù)器端口。然后注冊回調(diào)函數(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   /* 設(shè)置服務(wù)器端的IP地址 */
10   IP4_ADDR( &DestIPaddr,udpServerIP[0],udpServerIP[1],udpServerIP[2],udpServerIP[3]);
11  
12   /* 創(chuàng)建一個(gè)新的UDP控制塊 */
13   upcb = udp_new();
14  
15   if (upcb!=NULL)
16   {
17     /* 服務(wù)器端地址、端口配置 */
18     err= udp_connect(upcb, &DestIPaddr, UDP_ECHO_SERVER_PORT);
19  
20     if (err == ERR_OK)
21     {
22       /* 注冊回調(diào)函數(shù) */
23       udp_recv(upcb, UDPClientCallback, NULL);
24       /**數(shù)據(jù)發(fā)送,第一次連接時(shí)客戶端發(fā)送數(shù)據(jù)至服務(wù)器端,發(fā)送函數(shù)中會(huì)遍歷查找源IP地址的配置,如果源IP地址未配置,則數(shù)據(jù)發(fā)送失敗。該處出現(xiàn)的問題在后面總結(jié)中提到了**/
25       UdpClientSendPacket(upcb,data);  
26     }
27   }
28 }

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

1 /* 定義UDP客戶端數(shù)據(jù)處理回調(diào)函數(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   /* 分配內(nèi)存空間 */
15   p = pbuf_alloc(PBUF_TRANSPORT,strlen((char*)data), PBUF_POOL);
16  
17   if (p != NULL)
18   {
19  
20     /* 復(fù)制數(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 }

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

4 、結(jié)論

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

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

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

    關(guān)注

    2

    文章

    1500

    瀏覽量

    62010
  • UDP
    UDP
    +關(guān)注

    關(guān)注

    0

    文章

    325

    瀏覽量

    33937
  • 客戶端
    +關(guān)注

    關(guān)注

    1

    文章

    290

    瀏覽量

    16686
  • RAW
    RAW
    +關(guān)注

    關(guān)注

    0

    文章

    21

    瀏覽量

    3801
收藏 人收藏

    評論

    相關(guān)推薦

    請問如何獲取遠(yuǎn)程客戶端的IP和端口號進(jìn)行UDP廣播?

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

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

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

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

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

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

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

    如何獲取連接的UDP客戶端的遠(yuǎn)程MAC地址Harmony 1.09

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

    請問RN1810是否可以同時(shí)激活UDP客戶端UDP服務(wù)器或TCP客戶端?

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

    API怎么創(chuàng)建客戶端會(huì)話結(jié)構(gòu)體?

    API創(chuàng)建客戶端會(huì)話結(jié)構(gòu)體
    發(fā)表于 03-30 06:56

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

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

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

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

    CSDN博客客戶端源碼

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

    JAVA教程之UDP客戶端模型

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

    TCP回響客戶端RAW API接口

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

    網(wǎng)絡(luò)調(diào)試和串口調(diào)試集合UDP TCP客戶端和TCP服務(wù)器應(yīng)用程序免費(fèi)下載

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

    基于RAW APIUDP服務(wù)器設(shè)計(jì)

    前面我們已經(jīng)完成了LwIP協(xié)議?;谶壿嫷幕疽浦玻谶@一節(jié)我們將以RAW API來實(shí)現(xiàn)UDP服務(wù)器。
    的頭像 發(fā)表于 12-14 14:56 ?1157次閱讀
    基于<b class='flag-5'>RAW</b> <b class='flag-5'>API</b>的<b class='flag-5'>UDP</b>服務(wù)器設(shè)計(jì)

    基于LwIP的TCP客戶端設(shè)計(jì)

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