W5500-EVB-PICO 做UDP Server進行數據回環測試(七)

前言

????????前面我們用W5500-EVB-PICO 開發板在TCP Client和TCP Server模式下,分別進行數據回環測試,本章我們將用開發板在UDP Server模式下進行數據回環測試。

UDP是什么?什么是UDP Server?能干什么?

????????UDP (User Dataqram Protocol) 是一種無連接的、不可靠的傳輸協議,用于在計算機網絡上傳輸數據UDP Server是指UDP網絡服務的服務器端連接,用于接收客戶端的數據報文并返回響應,實現網絡數據的交互。
????????UDP Server的主要作用是接收客戶端發送的數據報文,并進行處理和響應。通過UDP Server,客戶端可以將數據報文發送到服務器,并從服務器接收響應。由于UDP是無連接的,因此每個數據報文都是獨立處理的,服務器對于未收到的數據報文不會重傳。
????????在UDP Server中,服務器程序需要指定監聽的端口號,并使用UDP協議接收客戶端發送的數據報文。一旦接收到數據報文,服務器程序會對報文進行處理,并返回相應的響應報文。
????????因此,UDP Server可以幫助設備實現數據報文的快速傳輸和響應,適用于一些對于數據傳輸速度和實時性要求較高的應用,如視頻直播、語音通話等。在UDP Server中,由于數據報文的傳輸是不可靠的,因此需要客戶端程序進行重傳和超時處理,以保證數據的可靠傳輸。

UDP Server 和 UDP Client有何不同?

UDP服務器:

  • 首先初始化
  • 打開特定端口監聽
  • 可以接受多個客戶端連接

UDP客戶端:

  • 指定目標IP和端口
  • 發送數據

從套接字編程角度來看,兩者完全相同。因此我們僅用UDP Server來做數據回環測試。

連接方式

使開發板和我們的電腦處于同一網段:

  • 開發板通過交叉線直連主機
  • 開發板和主機都接在路由器LAN口

測試工具

  • 網路調試工具(任意)
  • wireshark抓包工具

回環測試

1.相關代碼

我們打開例程中庫文件的loopback.c文件,可以看到udp server回環測試函數,它有三個參數:socket(套接字)端口號(0~7個端口,可開8路socket)、數據收發緩存buf、監聽端口;原理上依舊是通過Switch狀態機輪詢socket端口(所開端口的套接字)狀態,根據不同狀態做出相應處理,與tcp不同的是,udp只有做了兩個狀態處理,如果為關閉狀態就初始化socket狀態為udp協議模式,并開始監聽設置的端口;如果狀態已經處于udp模式,即socket初始化后,就進行判斷是否收到數據,收到就進行回傳。如下所示:

int32_t loopback_udps(uint8_t sn, uint8_t* buf, uint16_t port)
{int32_t  ret;uint16_t size, sentsize;uint8_t  destip[4];uint16_t destport;switch(getSn_SR(sn)){case SOCK_UDP :if((size = getSn_RX_RSR(sn)) > 0){if(size > DATA_BUF_SIZE) size = DATA_BUF_SIZE;ret = recvfrom(sn, buf, size, destip, (uint16_t*)&destport);buf[ret]=0x00;printf("recv form[%d.%d.%d.%d][%d]: %s\n", destip[0],destip[1],destip[2],destip[3],destport,buf);if(ret <= 0){
#ifdef _LOOPBACK_DEBUG_printf("%d: recvfrom error. %ld\r\n",sn,ret);
#endifreturn ret;}size = (uint16_t) ret;sentsize = 0;while(sentsize != size){ret = sendto(sn, buf+sentsize, size-sentsize, destip, destport);if(ret < 0){
#ifdef _LOOPBACK_DEBUG_printf("%d: sendto error. %ld\r\n",sn,ret);
#endifreturn ret;}sentsize += ret; // Don't care SOCKERR_BUSY, because it is zero.}}break;case SOCK_CLOSED:
#ifdef _LOOPBACK_DEBUG_//printf("%d:UDP loopback start\r\n",sn);
#endifif((ret = socket(sn, Sn_MR_UDP, port, 0x00)) != sn)return ret;
#ifdef _LOOPBACK_DEBUG_printf("%d:Opened, UDP loopback, port [%d]\r\n", sn, port);
#endifbreak;default :break;}return 1;
}

然后我們在主函數里循環調用測試函數即可。可以看到里面還注釋了一個udp client回環測試函數,這個基本跟udp server相同,獨立出來是為了方便用戶自己進行測試,這里不在演示。如下所示:

#define SOCKET_ID 0
#define ETHERNET_BUF_MAX_SIZE (1024 * 2)void network_init(void);wiz_NetInfo net_info = {.mac = {0x00, 0x08, 0xdc, 0x16, 0xed, 0x2e},.ip = {192, 168, 1, 10},.sn = {255, 255, 255, 0},.gw = {192, 168, 1, 1},.dns = {8, 8, 8, 8},.dhcp = NETINFO_STATIC};
wiz_NetInfo get_info;
static uint8_t ethernet_buf[ETHERNET_BUF_MAX_SIZE] = {0,};
static uint8_t destip[4]={192, 168, 1, 2};
static uint16_t destport = 8080;
static uint16_t local_port =8000;
int main()                                                          
{   stdio_init_all();sleep_ms(2000);network_init();while(true){// loopback_udpc(SOCKET_ID, ethernet_buf, destip, destport);loopback_udps(SOCKET_ID, ethernet_buf, local_port);sleep_ms(500);}}void network_init(void)
{uint8_t temp;wizchip_initialize();printf("W5500 udp test example.\r\n");sleep_ms(2000);wizchip_setnetinfo(&net_info);print_network_information(get_info);sleep_ms(2000);   
}

2.測試現象

編譯燒錄后,打開串行監視器,看到網絡信息配置成功后,打開兩個網絡調試助手,參數依次設置為UDP、本機的IP、8080,注意另一個調試助手的端口參數設置跟第一個不可以相同,避免沖突;這里將其設置為8081,完成后打開;然后遠程IP和端口選擇我們開發板設置的IP和端口,我這里是192.168.1.10 : 8000,然后我們讓第一個調試助手發送0~9十個阿拉伯數字,第二個發送字符串:hello wiznet,可以看到串口打印收到不同客戶端的數據,而且調試助手也分別收到了相對應的數據回傳。如下圖所示:

?我們可以打開wireshark抓包工具,輸入命令<ip.addr == 192.168.1.10 and udp>過濾數據包(IP地址改成自己電腦的IP或者開發板的IP地址即可);然后兩個調試助手依次發送,可以到抓到的數據包。如下圖所示:

相關鏈接?

本章相關例程鏈接https://gitee.com/wiznet-hk/w5500-evb-pico-routine.git

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/39846.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/39846.shtml
英文地址,請注明出處:http://en.pswp.cn/news/39846.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

圖數據庫_Neo4j學習cypher語言_使用CQL命令002_刪除節點_刪除屬性_結果排序Order By---Neo4j圖數據庫工作筆記0006

然后我們再來看如何刪除節點 可以看到首先 我們這里 比如我要刪除張三 可以看到 match (n:student) where n.name = "張三" delete n 這樣就是刪除了student集合中,name是張三的節點 然后我們再來看 如何來刪除關系 match (n:student)-[r]->(m:student) where…

機器學習、cv、nlp的一些前置知識

為節省篇幅&#xff0c;不標注文章來源和文章的問題場景。大部分是我的通俗理解。 文章目錄 向量關于向量的偏導數&#xff1a;雅可比矩陣二階導數矩陣&#xff1a;海森矩陣隨機變量隨機場伽馬函數beta分布數學術語坐標上升法協方差訓練集&#xff0c;驗證集&#xff0c;測試集…

Nginx的安裝及負載均衡搭建

一.Nginx的安裝 1&#xff09;準備安裝環境 yum install -y make gcc gcc-c pcre-devel pcre zlib zlib-devel openssl openssl-develPERE PCRE(Perl Compatible Regular Expressions)是一個Perl庫&#xff0c;包括 perl 兼容的正則表達式庫。 nginx的http模塊使用pcre來解…

前端jd要求:了解一門后端開發語言優先 解決方案之Node.js

前端jd要求&#xff1a;了解一門后端開發語言優先 解決方案之Node.js 前言常見的后端開發語言一、什么是 Node.js二、學習 Node.js 的前置知識三、學習 Node.js 的步驟1、Node.js 的安裝2、Node.js 的基本語法和 API模塊導入和導出文件讀寫操作HTTP 服務器命令行參數 3、Node.j…

可能導致不可接受的信息安全事件發生的核電站事故。

立陶宛伊格納利納核電站&#xff08;1992 年&#xff09; 一名在該核電站工作的程序員將惡意代碼上傳到一個負責反應堆子系統運行的自動化系統中&#xff0c;該系統被及時發現。 但如果沒有及時發現&#xff0c;誰知道會發生什么呢&#xff1f;核電站被關閉以進行調查。有關這…

Vue-8.集成(.editorconfig、.eslintrc.js、.prettierrc)

介紹 同時使用 .editorconfig、.prettierrc 和 .eslintrc.js 是很常見的做法&#xff0c;因為它們可以在不同層面上幫助確保代碼的格式一致性和質量。這種組合可以在開發過程中提供全面的代碼維護和質量保證。然而&#xff0c;這也可能增加一些復雜性&#xff0c;需要謹慎配置…

Coreutils工具包,Windows下使用Linux命令

之前總結過兩篇有關【如何在Windows系統下使用Linux的常用命令】的文章&#xff1a; GnuWin32&#xff0c;Windows下使用Linux命令 UnxUtils工具包&#xff0c;Windows下使用Linux命令 今天再推薦一個類似的工具包Coreutils 一、簡介 GNU core utilities是GNU操作系統基本…

【HDFS】hdfs的count命令的參數詳解

Usage: hadoop fs -count [-q] [-h] [-v] [-x] [-t [<storage type>]] [-u] [-e] [-s] <paths

(學習筆記-進程管理)怎么避免死鎖?

死鎖的概念 在多線程編程中&#xff0c;我們為了防止多線程競爭共享資源而導致數據錯亂&#xff0c;都會在操作共享資源之前加上互斥鎖&#xff0c;只有成功獲得到鎖的線程&#xff0c;才能操作共享資源&#xff0c;獲取不到鎖的線程就只能等待&#xff0c;直到鎖被釋放。 那…

創建一個簡單的HTML Viewer應用程序

使用wxPython和內嵌瀏覽器來創建一個簡單的HTML Viewer應用程序。 在本篇文章中&#xff0c;我們將使用Python和wxPython模塊來創建一個簡單的HTML Viewer應用程序。這個應用程序可以讓用戶輸入HTML內容&#xff0c;并在內嵌瀏覽器中顯示該內容的效果。 準備工作 在開始之前…

apache doris和StarRocks的區別

記錄一下最新要用到2個新數據庫的區別 Apache Doris是一個分布式的列式存儲系統&#xff0c;它的設計目標是提供大規模數據處理的可靠性和高性能。Doris采用了集群方式&#xff0c;通過將數據分布在多個機器上進行處理來提高性能&#xff0c;并提供了SQL查詢接口方便用戶使用。…

QT:定時器事件

定時器第一種辦法&#xff1a; 1.利用事件timerEvent&#xff0c;在幫助文檔中找到該字段&#xff1a;[override virtual protected] void QTimer::timerEvent(QTimerEvent *e) 重寫該虛函數 //重寫定時器事件void timerEvent(QTimerEvent *e);2.啟動定時器startTimer(1000); …

區間預測 | MATLAB實現QRGRU門控循環單元分位數回歸時間序列區間預測

區間預測 | MATLAB實現QRGRU門控循環單元分位數回歸時間序列區間預測 目錄 區間預測 | MATLAB實現QRGRU門控循環單元分位數回歸時間序列區間預測效果一覽基本介紹模型描述程序設計參考資料 效果一覽 基本介紹 MATLAB實現QRGRU門控循環單元分位數回歸時間序列區間預測。基于分位…

卷積神經網絡教程 (CNN) – 使用 TensorFlow 在 Python 中開發圖像分類器

在這篇博客中,讓我們討論什么是卷積神經網絡 (CNN) 以及 卷積神經網絡背后的架構——旨在解決 圖像識別系統和分類問題。 卷積神經網絡在圖像和視頻識別、推薦系統和自然語言處理方面有著廣泛的應用。 目錄 計算機如何讀取圖像? 為什么不是全連接網絡?

[GitOps]微服務版本控制:使用ArgoCD 部署Grafana Loki

背景介紹 請回答&#xff1a;你們是如何保證線上部署的服務&#xff0c;從服務版本到參數配置&#xff0c;都是和測試通過的版本是一致的呢&#xff1f; 本文將介紹GitOps的基本原理以及ArgoCD的使用&#xff1a;ArgoCD部署Grafana Loki 到k8s集群。 本文項目地址&#xff1…

詳細介紹如何使用 OpenCV 對圖像進行銳化

將了解銳化圖像的過程,我們將使用內核來突出顯示每個特定像素并增強其發出的顏色。它與模糊過程非常相似,只不過現在我們不是創建一個內核來平均每個像素強度,而是創建一個內核,該內核將使像素強度更高,因此對人眼來說更加突出。 了解流程的后端。 很高興知道內核用于模糊…

Nginx 解決api跨域問題

環境: nginx 1.22.1 寶塔8.0 php lavarel 在nginx里加入下面的設置 #這里填*就是任何域名都允許跨域add_header Access-Control-Allow-Origin "*";#CORS請求默認不發送Cookie和HTTP認證信息。但是如果要把Cookie發到服務器&#xff0c;要服務器同意&#xff0c…

Webpack和Parcel詳解

構建工具和打包器是在開發過程中幫助組織、優化和打包項目的工具。它們可以處理依賴管理、資源優化、代碼轉換等任務&#xff0c;從而使開發流程更高效。以下是關于構建工具和打包器的一些指導&#xff1a; **Webpack&#xff1a;** Webpack 是一個功能強大的模塊打包器&#…

Java“牽手”1688商品詳情頁面數據獲取方法,1688API實現批量商品數據抓取示例

背景&#xff1a;1688商城是一個網上購物平臺&#xff0c;售賣各類商品&#xff0c;包括服裝、鞋類、家居用品、美妝產品、電子產品等。要獲取1688商品詳情數據&#xff0c;您可以通過開放平臺的接口或者直接訪問1688商城的網頁來獲取商品詳情信息。以下是兩種常用方法的介紹&a…

538頁21萬字數字政府智慧政務大數據云平臺項目建設方案WORD

導讀&#xff1a;原文《538頁21萬字數字政府智慧政務大數據云平臺項目建設方案WORD》&#xff08;獲取來源見文尾&#xff09;&#xff0c;本文精選其中精華及架構部分&#xff0c;邏輯清晰、內容完整&#xff0c;為快速形成售前方案提供參考。 根據業務的不同屬性&#xff0c…