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

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

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

基于LwIP的UDP服務(wù)器設(shè)計(jì)

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

我們已經(jīng)實(shí)現(xiàn)了在FreeRTOS系統(tǒng)上的LwIP的移植工作,但只是簡單的在系統(tǒng)平臺(tái)上跑了起來。我們還希望能做更多的事情,這一節(jié)我們就在FreeRTOS系統(tǒng)上實(shí)現(xiàn)基于LwIP的UDP服務(wù)器。

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ù)包分組、組裝和不能對(duì)數(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é),具體如下:源端口號(hào)、目標(biāo)端口號(hào)、數(shù)據(jù)報(bào)長度、校驗(yàn)值。其數(shù)據(jù)結(jié)構(gòu)如下:

????UDP協(xié)議使用端口號(hào)為不同的應(yīng)用保留其各自的數(shù)據(jù)傳輸通道。UDP和TCP協(xié)議正是采用這一機(jī)制實(shí)現(xiàn)對(duì)同一時(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ù)留或注冊(cè)的靜態(tài)端口;而另外一些網(wǎng)絡(luò)應(yīng)用則可以使用未被注冊(cè)的動(dòng)態(tài)端口。因?yàn)閁DP報(bào)頭使用兩個(gè)字節(jié)存放端口號(hào),所以端口號(hào)的有效范圍是從0到65535。一般來說,大于49151的端口號(hào)都代表動(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é)議可以檢測(cè)是否出錯(cuò)。

2、帶系統(tǒng)UDP服務(wù)器的設(shè)計(jì)

??關(guān)于UDP服務(wù)器,我們以前在裸機(jī)狀態(tài)下,使用RAW/CallBack API函數(shù)實(shí)現(xiàn)過。在這里我們將基于操作系統(tǒng)來實(shí)現(xiàn)UDP服務(wù)器,在此我們需要使用netconn API函數(shù)實(shí)現(xiàn)。

2.1、netconn API

??在帶操作系統(tǒng)的LwIP應(yīng)用中,應(yīng)用程序需要使用netconn API函數(shù)來實(shí)現(xiàn)相關(guān)的應(yīng)用,接下來我們了解一下netconn API函數(shù)。

(1)、公用部分函數(shù)

??其中即可用于TCP也可用于UDP的公共netconn API函數(shù)如下:

序號(hào) 函數(shù) 描述
1 netconn_new() 創(chuàng)建一個(gè)新連接
2 netconn_peer() 獲取遠(yuǎn)程IP地址和端口
3 netconn_addr() 獲取本地IP地址和端口
4 netconn_set_ipv6only() 設(shè)置netconn調(diào)用的IPv6狀態(tài)
5 netconn_get_ipv6only() 獲取netconn調(diào)用的IPv6狀態(tài)
6 netconn_delete() 刪除現(xiàn)有連接
7 netconn_bind() 綁定到本地端口/ ip的連接
8 netconn_connect() 連接到遠(yuǎn)程端口/ ip的連接
9 netconn_recv() 從netconn接收數(shù)據(jù)
10 netconn_gethostbyname_addrtype () 執(zhí)行DNS查詢,只返回一個(gè)IP地址

(2)、用于TCP的函數(shù)

??對(duì)于TCP連接來說,還包括如下的netconn API函數(shù):

序號(hào) 函數(shù) 描述
1 netconn_listen() 將TCP連接設(shè)置為偵聽模式
2 netconn_write() 在連接的TCP netconn上發(fā)送數(shù)據(jù)
3 netconn_listen_with_backlog () 將TCP netconn設(shè)置為偵聽模式
4 netconn_accept() 接受偵聽TCP連接上的傳入連接
5 netconn_recv_tcp_pbuf () 從TCP netconn接收數(shù)據(jù)(以pbuf的形式)
6 netconn_write_partly () 通過TCP netconn發(fā)送數(shù)據(jù)
7 netconn_close() 關(guān)閉TCP netconn而不刪除它
8 netconn_shutdown () 關(guān)閉TCP netconn的一端或兩端(不刪除它)

(3)、用于UDP的函數(shù)

??對(duì)于UDP連接來說,還包括如下的netconn API函數(shù):

序號(hào) 函數(shù) 描述
1 netconn_disconnect() 斷開與遠(yuǎn)程端口/ ip的連接
2 netconn_sendto() 將數(shù)據(jù)發(fā)送到指定的遠(yuǎn)程端口/ ip(不適用于TCP)
3 netconn_send() 將數(shù)據(jù)發(fā)送到當(dāng)前連接的遠(yuǎn)程端口/ ip(不適用于TCP)
4 netconn_join_leave_group() 基本的IGMP多播支持

2.2、UDP服務(wù)器的流程

??在RAW API實(shí)現(xiàn)UDP服務(wù)器時(shí),我們使用回調(diào)函數(shù),當(dāng)接受到數(shù)據(jù)報(bào)文時(shí),回調(diào)函數(shù)會(huì)被調(diào)用。在有操作系統(tǒng)的情況下,我們肯定是實(shí)現(xiàn)多線程,所以我們將UDP服務(wù)器設(shè)定為一個(gè)任務(wù)來執(zhí)行。在這個(gè)任務(wù)中我們將按如下流程來實(shí)現(xiàn)UDP服務(wù)器。

??從上圖中我們與無操作系統(tǒng)時(shí)的操作很類似。創(chuàng)建控制塊、綁定端口等是一樣的。但在內(nèi)部接收和發(fā)送報(bào)文的方式卻是有區(qū)別的。

??至于UDP服務(wù)器最終實(shí)現(xiàn)了哪些功能,需要我們根據(jù)實(shí)際需要在處理并返回信息階段實(shí)施。功能可以很復(fù)雜也可以很簡單,在這里我們就是實(shí)現(xiàn)一個(gè)簡單的回環(huán)服務(wù)器。

3、帶系統(tǒng)UDP服務(wù)器的實(shí)現(xiàn)

??我們已經(jīng)明白了UDP服務(wù)器在使用netconn API的實(shí)現(xiàn)方式及流程。接下來我們就來實(shí)現(xiàn)它。我們通過兩個(gè)函數(shù)來實(shí)現(xiàn):一是初始化任務(wù),即創(chuàng)建相應(yīng)的任務(wù);二是實(shí)現(xiàn)這個(gè)任務(wù)函數(shù),也就是我們的UDP服務(wù)器。

??先實(shí)現(xiàn)任務(wù)的創(chuàng)建。這個(gè)函數(shù)很簡單,因?yàn)樵谝浦睱wIP協(xié)議棧時(shí),要求在sys_arch.c文件中實(shí)現(xiàn)一個(gè)名為sys_thread_new的任務(wù)創(chuàng)建函數(shù),而我們已經(jīng)實(shí)現(xiàn)了這個(gè)任務(wù)創(chuàng)建函數(shù),所以我們直接調(diào)用它就好了。

/* UDP初始化配置 */
void UDP_Server_Initialization(void)
{
 sys_thread_new("udpserver_thread", UDPServerThread, NULL, DEFAULT_THREAD_STACKSIZE,UDPECHO_THREAD_PRIO );
}

??接下來,我們看看UDP服務(wù)器任務(wù)函數(shù)的實(shí)現(xiàn),根據(jù)上一節(jié)我們給出的流程,實(shí)現(xiàn)如下:

/* 定義UDP服務(wù)器數(shù)據(jù)處理進(jìn)程 */
static void UDPServerThread(void *arg)
{
 err_t err, recv_err;
 static struct netconn *conn;
 static struct netbuf *buf;
static ip_addr_t *addr;
static unsigned short port;
 
 LWIP_UNUSED_ARG(arg);
 
 conn = netconn_new(NETCONN_UDP);
 if (conn!= NULL)
 {
  err = netconn_bind(conn, IP_ADDR_ANY,UDP_ECHO_SERVER_PORT);
  if (err == ERR_OK)
  {
   while (1) 
   {
     recv_err = netconn_recv(conn, &buf);
   
     if (recv_err == ERR_OK) 
     {
      addr = netbuf_fromaddr(buf);
      port = netbuf_fromport(buf);
      netconn_connect(conn, addr, port);
      buf->addr.addr = 0;
      netconn_send(conn,buf);
      netbuf_delete(buf);
     }
   }
  }
  else
  {
   netconn_delete(conn);
  }
 }
}

??對(duì)于UDP連接來說,netconn_connect函數(shù)的調(diào)用只是簡單的設(shè)置UDP控制塊中的remote_ip和remote_port字段。其實(shí)在這里不使用該函數(shù)也是沒問題的,因?yàn)閎uf中已經(jīng)包含了相關(guān)的信息。

4、帶系統(tǒng)UDP服務(wù)器總結(jié)

??我們實(shí)現(xiàn)了一個(gè)簡單的UDP服務(wù)器應(yīng)用,其實(shí)帶有操作系統(tǒng)時(shí)只是在軟件編寫方面采用的形式不一樣。從外界看來,依然是一個(gè)UDP服務(wù)器,與有無操作系統(tǒng)無關(guān)。所以我們的測(cè)試方法也是一樣的,與我們預(yù)期的結(jié)果也是一樣的。

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

    關(guān)注

    12

    文章

    8700

    瀏覽量

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

    關(guān)注

    0

    文章

    317

    瀏覽量

    33801
  • FreeRTOS
    +關(guān)注

    關(guān)注

    12

    文章

    483

    瀏覽量

    61721
  • LwIP
    +關(guān)注

    關(guān)注

    2

    文章

    84

    瀏覽量

    26931
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    使用lwip socket udp功能,開發(fā)板為客戶端時(shí)不能夠接收服務(wù)器端發(fā)送過來的數(shù)據(jù) ?

    請(qǐng)教下,使用 lwip socket udp 功能,開發(fā)板為客戶端時(shí)不能夠接收服務(wù)器端發(fā)送過來的數(shù)據(jù) ? 1,如果開發(fā)板為 服務(wù)器端,收發(fā)都可以 2,如果開發(fā)板為 客戶端,不能夠接
    發(fā)表于 04-16 06:01

    如何打開UDP服務(wù)器?

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

    用GPRS的UDP協(xié)議跟服務(wù)器通信時(shí)服務(wù)器發(fā)送的數(shù)據(jù)收不到

    求助大神,為什么我現(xiàn)在用GPRS的UDP協(xié)議跟服務(wù)器通信的時(shí)候,發(fā)送數(shù)據(jù)正常,服務(wù)器那邊也能收到,但是服務(wù)器發(fā)送的數(shù)據(jù)我為什么會(huì)收不到?急求...
    發(fā)表于 04-16 06:36

    基于udp協(xié)議用單片機(jī)做一個(gè)服務(wù)器

    我想基于lwIP協(xié)議中的UDP協(xié)議,用單片機(jī)做一個(gè)服務(wù)器,接受電腦的指令然后返回?cái)?shù)據(jù)。以下是我的代碼
    發(fā)表于 08-02 07:21

    請(qǐng)問用lwip能在程序中同時(shí)實(shí)現(xiàn)tcp客戶端,tcp服務(wù)器udp的功能嗎?

    lwip能否在程序中同時(shí)實(shí)現(xiàn)tcp客戶端,tcp服務(wù)器udp的功能?有實(shí)現(xiàn)的請(qǐng)發(fā)一下源碼,不能發(fā)源碼的請(qǐng)說一下實(shí)現(xiàn)的方式方法,三種功能單獨(dú)的都已經(jīng)實(shí)現(xiàn)了,但是不知道怎么合并,自己試著合并了一下發(fā)現(xiàn)還是只能實(shí)現(xiàn)其中一種功能
    發(fā)表于 03-15 22:24

    關(guān)于UDP服務(wù)器機(jī)制的問題怎么解決

    嗨,我需要了解更多關(guān)于UDP服務(wù)器機(jī)制。以下是我的問題:1。我可以說UDP服務(wù)器每次只能服務(wù)一個(gè)連接嗎?之所以這樣說是因?yàn)楫?dāng)我使用TCPIP
    發(fā)表于 05-05 10:38

    用AT+CIPSERVER=1,80啟動(dòng)服務(wù)器時(shí),可以啟動(dòng)UDP服務(wù)器嗎?

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

    基于STM32F107的UDP服務(wù)器程序

    基于STM32F107的UDP服務(wù)器程序
    發(fā)表于 03-26 15:44 ?151次下載

    實(shí)例64 UDP服務(wù)器模型

    JAVA教程之UDP服務(wù)器模型,很好的JAVA的資料,快來學(xué)習(xí)吧
    發(fā)表于 04-11 17:28 ?2次下載

    如何使用UDP協(xié)議和單片機(jī)做一個(gè)服務(wù)器進(jìn)行的數(shù)據(jù)接收與發(fā)送的程序

    我想基于lwIP協(xié)議中的UDP協(xié)議,用單片機(jī)做一個(gè)服務(wù)器,接受電腦的指令然后返回?cái)?shù)據(jù)。以下是我的代碼
    發(fā)表于 04-25 18:27 ?3次下載
    如何使用<b class='flag-5'>UDP</b>協(xié)議和單片機(jī)做一個(gè)<b class='flag-5'>服務(wù)器</b>進(jìn)行的數(shù)據(jù)接收與發(fā)送的程序

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

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

    基于LwIP的TCP服務(wù)器設(shè)計(jì)

    前面我們實(shí)現(xiàn)了UDP服務(wù)器及客戶端以及基于其上的TFTP應(yīng)用服務(wù)器。接下來我們將實(shí)現(xiàn)同樣廣泛應(yīng)用的TCP協(xié)議各類應(yīng)用。
    的頭像 發(fā)表于 12-14 15:09 ?1516次閱讀
    基于<b class='flag-5'>LwIP</b>的TCP<b class='flag-5'>服務(wù)器</b>設(shè)計(jì)

    【EsDA應(yīng)用】串口轉(zhuǎn)UDP服務(wù)器

    如何讓自動(dòng)化領(lǐng)域的串口設(shè)備具備聯(lián)網(wǎng)能力?本文將基于EsDA平臺(tái),帶你開發(fā)一個(gè)串口轉(zhuǎn)UDP服務(wù)器業(yè)務(wù),快速實(shí)現(xiàn)串口聯(lián)網(wǎng)功能。 ?? 簡介 串口服務(wù)器在物聯(lián)網(wǎng)中的應(yīng)用十分廣泛,數(shù)據(jù)采集上報(bào)、遠(yuǎn)程控制等
    的頭像 發(fā)表于 02-22 13:20 ?594次閱讀

    【EsDA應(yīng)用】串口轉(zhuǎn)UDP服務(wù)器

    如何讓自動(dòng)化領(lǐng)域的串口設(shè)備具備聯(lián)網(wǎng)能力?本文將基于EsDA平臺(tái),帶你開發(fā)一個(gè)串口轉(zhuǎn)UDP服務(wù)器業(yè)務(wù),快速實(shí)現(xiàn)串口聯(lián)網(wǎng)功能。簡介串口服務(wù)器在物聯(lián)網(wǎng)中的應(yīng)用十分廣泛,數(shù)據(jù)采集上報(bào)、遠(yuǎn)程控制等網(wǎng)絡(luò)化項(xiàng)目都
    的頭像 發(fā)表于 03-06 13:55 ?525次閱讀
    【EsDA應(yīng)用】串口轉(zhuǎn)<b class='flag-5'>UDP</b><b class='flag-5'>服務(wù)器</b>

    【EsDA應(yīng)用】串口服務(wù)器——UDP Server

    如何讓自動(dòng)化領(lǐng)域的串口設(shè)備具備聯(lián)網(wǎng)能力?本文將基于EsDA平臺(tái),帶你開發(fā)一個(gè)串口服務(wù)器UDP服務(wù)器的業(yè)務(wù),快速實(shí)現(xiàn)串口聯(lián)網(wǎng)功能。? ?? 簡介 串口服務(wù)器本質(zhì)是將串口數(shù)據(jù)通過各種網(wǎng)絡(luò)
    的頭像 發(fā)表于 07-12 11:45 ?994次閱讀
    【EsDA應(yīng)用】串口<b class='flag-5'>服務(wù)器</b>——<b class='flag-5'>UDP</b> Server