在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內不再提示

基于RAW API的UDP服務器設計

CHANBAEK ? 來源:木南創智 ? 作者:尹家軍 ? 2022-12-14 14:56 ? 次閱讀

前面我們已經完成了LwIP協議棧基于邏輯的基本移植,在這一節我們將以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控制塊到任意IP地址及制定端口。

最后,為UDP控制塊注冊數據處理回調函數,這里需要說明一下,這就是RAW AIP的回調函數。根據你要實現的功能不同復雜程度完全不一樣。我們由于要實現一個回環服務器,所以相對簡單。只需要將收到的信息,以我們想要的方式發送回客戶端就可以了。

為了很好的實現UDP服務器,還有一個問題需要設計好,就是我們前面我們曾提到的端口。我們都知道TCP/IP協議族包括有很多的協議,那通訊究竟是針對哪一個協議發生的呢?所謂兩臺機器間的通訊,實際上是主機上的應用進程間的通訊,端口號就是為了最終實現主機上應用進程的通訊。我們常見且會在后續使用到的協議端口如下:

為了使用方便我們將這些端口定義為宏,并存儲到一個專門的文件中。在這里我們本次實現UDP服務器也需要制定一個端口,其實支持UDP的端口都沒問題,但為了方便描述我們制定其為回環顯示端口。

3 UDP****服務器實現

我們了解了其實現的基本過程,其實并不復雜。事實上,回調函數的內容才是我們真正需要考慮的東西。我們將其實現分為兩個部分:一是UDP服務器的初始化部分;二是UDP服務器功能部分,也就是回調函數所執行的內容。

首先實現UDP服務器的初始化部分。初始化部分定義一個新的UDP控制塊,并將其綁定到任意IP地址及指定端口。然后注冊數據處理回調函數。

1 /* UDP初始化配置 */
 2 void UDP_Server_Initialization(void)
 3 {
 4   static char * recv_arg="We recieved a UDP data
";
 5   struct udp_pcb *upcb;
 6  
 7   /* 生成一個新的UDP控制塊 */
 8   upcb = udp_new();
 9   
10   /* 綁定upcb塊到任意IP地址及指定端口*/
11   udp_bind(upcb, IP_ADDR_ANY, UDP_ECHO_SERVER_PORT);
12  
13   /* 為upcb指定數據處理回調函數 */
14   udp_recv(upcb,UDPServerCallback,(void *)recv_arg);
15 }

關于為什么要將本地IP綁定到任意IP呢?這是因為UDP服務器收到數據包后,LwIP會先判斷其數據包的目的IP和端口是否和本地注冊的PCB控制塊綁定的本地的IP和本地端口號是否匹配。所以我們綁定PCB控制塊本地IP設為IP_ADDR_ANY時,只要收到的數據包的目的IP非廣播地址,端口號匹配,那么均認為數據包的目的IP和端口是與本地注冊的PCB控制塊綁定的本地IP和端口號相匹配的。省去了自己構造本地IP的過程。

初始化完畢后,注冊了數據處理回調函數。接下來需要實現回調函數的內容。回調函數主要實現對數據的處理,這取決于自己的需求。在這里我們在接收到UDP客戶端數據包后,不對其作什么處理,因為這一數據本來無意義,我們對任何的客戶端請求給予固定的回復。

1 /* 定義UDP服務器數據處理回調函數 */
 2 static void UDPServerCallback(void *arg,struct udp_pcb *upcb,struct pbuf *revBuf,const ip_addr_t *addr,u16_t port)
 3 {
 4   struct pbuf *sendBuf = NULL;
 5   const char* reply = "This is reply!
";
 6  
 7   pbuf_free(revBuf);
 8   
 9   sendBuf = pbuf_alloc(PBUF_TRANSPORT, strlen(reply)+1, PBUF_RAM);
10   if(!sendBuf)
11   {
12     return;
13   }
14  
15   memset(sendBuf->payload,0,sendBuf->len);
16   memcpy(sendBuf->payload, reply, strlen(reply));
17   udp_sendto(upcb, sendBuf, addr, port);
18   pbuf_free(sendBuf);
19 }

對于這個回調函數,它實際是賦給一個函數指針,所以雖然它的內容和名稱可以隨意,但其格式是有要求的:void (*udp_recv_fn)(void *arg, struct udp_pcb *pcb, struct pbuf *p,const ip_addr_t *addr, u16_t port)

4 、結論

至此,我們完成了簡單的UDP服務器,在這里我們使用客戶端來測試一下這個UDP服務器,測試結果如下:

這里只測試了一個客戶端兩屆服務器的情況,其實連接多個客戶端的情況也是沒問題的。如下:

佷顯然,如果我們希望實現更復雜的UDP服務器,我們只需要將我們想實現的功能做到回調函數中就可以了。

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

    關注

    12

    文章

    9331

    瀏覽量

    86131
  • API
    API
    +關注

    關注

    2

    文章

    1518

    瀏覽量

    62448
  • UDP
    UDP
    +關注

    關注

    0

    文章

    328

    瀏覽量

    34060
  • LwIP
    +關注

    關注

    2

    文章

    88

    瀏覽量

    27415
  • RAW
    RAW
    +關注

    關注

    0

    文章

    21

    瀏覽量

    3846
收藏 人收藏

    評論

    相關推薦

    如何打開UDP服務器

    4、封閉式 Where the answer packet should be: (\"RA151[s11=+21.5]+[s12=+20.2]+[s13=+20.3]45\") 有人可以告訴我如何打開UDP服務器嗎?或者我必須做些什么才能獲得
    發表于 07-15 07:22

    用GPRS的UDP協議跟服務器通信時服務器發送的數據收不到

    求助大神,為什么我現在用GPRS的UDP協議跟服務器通信的時候,發送數據正常,服務器那邊也能收到,但是服務器發送的數據我為什么會收不到?急求...
    發表于 04-16 06:36

    關于UDP服務器機制的問題怎么解決

    嗨,我需要了解更多關于UDP服務器機制。以下是我的問題:1。我可以說UDP服務器每次只能服務一個連接嗎?之所以這樣說是因為當我使用TCPIP
    發表于 05-05 10:38

    LWIP的RAW API UDP通信過程是如何實現的

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

    用AT+CIPSERVER=1,80啟動服務器時,可以啟動UDP服務器嗎?

    大家好, 我剛收到新的 esp 板,我發現有了新固件,我無法使用 AT 命令 AT+GMR 啟動 UDP 服務器,給我的是: 代碼:全選AT version:0.21.0.0 SDK version
    發表于 05-15 07:27

    基于STM32F107的UDP服務器程序

    基于STM32F107的UDP服務器程序
    發表于 03-26 15:44 ?151次下載

    實例64 UDP服務器模型

    JAVA教程之UDP服務器模型,很好的JAVA的資料,快來學習吧
    發表于 04-11 17:28 ?2次下載

    介紹RAW API接口及應用

    RAW API
    的頭像 發表于 07-05 00:35 ?7555次閱讀

    RAW API 接口的TCP服務器

    RAW Tcp回響服務器
    的頭像 發表于 07-05 00:10 ?3872次閱讀
    <b class='flag-5'>RAW</b> <b class='flag-5'>API</b> 接口的TCP<b class='flag-5'>服務器</b>

    基于RAW APIUDP客戶端設計

    前一節我們實現了基于RAW APIUDP服務器,在接下來,我們進一步利用RAW API實現
    的頭像 發表于 12-14 14:59 ?1356次閱讀
    基于<b class='flag-5'>RAW</b> <b class='flag-5'>API</b>的<b class='flag-5'>UDP</b>客戶端設計

    基于TCP的Telnet服務器設計

    前面我們已經實現了基于RAW API的TCP服務器和客戶端,也在此基礎上實現了HTTP應用。接下來我們實現一個基于TCP的Telnet服務器應用。
    的頭像 發表于 12-14 15:30 ?1425次閱讀
    基于TCP的Telnet<b class='flag-5'>服務器</b>設計

    【EsDA應用】串口轉UDP服務器

    如何讓自動化領域的串口設備具備聯網能力?本文將基于EsDA平臺,帶你開發一個串口轉UDP服務器業務,快速實現串口聯網功能。 ?? 簡介 串口服務器在物聯網中的應用十分廣泛,數據采集上報、遠程控制等
    的頭像 發表于 02-22 13:20 ?756次閱讀

    【EsDA應用】串口轉UDP服務器

    如何讓自動化領域的串口設備具備聯網能力?本文將基于EsDA平臺,帶你開發一個串口轉UDP服務器業務,快速實現串口聯網功能。簡介串口服務器在物聯網中的應用十分廣泛,數據采集上報、遠程控制等網絡化項目都
    的頭像 發表于 03-06 13:55 ?682次閱讀
    【EsDA應用】串口轉<b class='flag-5'>UDP</b><b class='flag-5'>服務器</b>

    【EsDA應用】串口服務器——UDP Server

    如何讓自動化領域的串口設備具備聯網能力?本文將基于EsDA平臺,帶你開發一個串口服務器UDP服務器的業務,快速實現串口聯網功能。? ?? 簡介 串口服務器本質是將串口數據通過各種網絡
    的頭像 發表于 07-12 11:45 ?1216次閱讀
    【EsDA應用】串口<b class='flag-5'>服務器</b>——<b class='flag-5'>UDP</b> Server

    服務器數據恢復—KVM虛擬機raw格式磁盤文件數據恢復案例

    服務器數據恢復環境: 一臺服務器安裝Linux操作系統+EXT4文件系統。服務器上運行數臺KVM虛擬機,每臺虛擬機包含一個qcow2格式的磁盤文件和一個raw格式的磁盤文件。
    的頭像 發表于 05-17 13:33 ?501次閱讀
    <b class='flag-5'>服務器</b>數據恢復—KVM虛擬機<b class='flag-5'>raw</b>格式磁盤文件數據恢復案例
    主站蜘蛛池模板: 18满xo影院视频免费体验区 | 国产理论在线观看 | 国内自拍 亚洲系列 欧美系列 | 欧美黄色性 | 国产精品午夜久久久久久99热 | 男人视频网 | 免费黄视频网站 | 久久综合精品视频 | 伊人五月婷婷 | 亚洲91在线视频 | 特级毛片aaaa级毛片免费 | 精品国产一二三区在线影院 | 看全色黄大色大片免费久久怂 | 欧美午夜视频在线 | 一区二区高清在线观看 | 在线观看视频一区二区三区 | 中文永久免费看电视网站入口 | 色天天色综合 | 欧美精品xxxxbbbb | 日本一区二区三区在线 视频观看免费 | 天天摸天天做天天爽 | 都市激情综合网 | 手机在线你懂的 | 四虎永久免费网站免费观看 | 天堂在线链接 | 黄色www网站| 高h道具触手play肉男男 | 欧美在线成人午夜影视 | 亚洲欧美在线一区 | 亚洲高清视频一区 | 午夜精品久久久久蜜桃 | 国产秦先生大战白丝97在线 | 成人啪啪免费视频 | 亚洲免费视频网址 | 伊人久久精品成人网 | 国产精品欧美一区二区三区不卡 | 国产三级在线 | 日韩第五页 | 老色视频| 99精品福利 | 午夜视频福利在线 |