linux UDP通訊:接口函數示例

一、主要用的接口:

??? //服務器端

??????? 1. socket() 創建套接字

??????? 2. bind() 綁定套接字

??? 與TCP區別開來,沒有listen()、accept()建立連接的過程

??????? 3. 通信 recvfrom() sendto()

??????? 4. close

??? //客戶端

??????? 1. socket() 創建套接字

??? 與TCP區別開來,沒有connect()建立連接的過程

??????? 2. 通信 sendto() recvfrom()

??????? 3. close()

二、代碼實例

UDP服務器端:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>int main() {int server_socket;struct sockaddr_in server_addr, client_addr;char buffer;socklen_t client_addr_len = sizeof(client_addr);server_socket = socket(AF_INET, SOCK_DGRAM, 0);if (server_socket == -1) {perror("socket");exit(EXIT_FAILURE);}server_addr.sin_family = AF_INET;server_addr.sin_port = htons(8888);server_addr.sin_addr.s_addr = INADDR_ANY;if (bind(server_socket, (struct sockaddr*)&server_addr, sizeof(server_addr)) == -1) {perror("bind");close(server_socket);exit(EXIT_FAILURE);}while (1) {char message[] = "Hello, client!";sendto(server_socket, message, strlen(message), 0, (struct sockaddr*)&client_addr, client_addr_len);sleep(1);}close(server_socket);return 0;
}

UDP客戶端:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>int main() {int client_socket;struct sockaddr_in server_addr;char buffer;socklen_t server_addr_len = sizeof(server_addr);client_socket = socket(AF_INET, SOCK_DGRAM, 0);if (client_socket == -1) {perror("socket");exit(EXIT_FAILURE);}server_addr.sin_family = AF_INET;server_addr.sin_port = htons(8888);inet_pton(AF_INET, "127.0.0.1", &(server_addr.sin_addr));sendto(client_socket, "Hello, server!", strlen("Hello, server!"), 0, (struct sockaddr*)&server_addr, server_addr_len);close(client_socket);return 0;
}

--------------------------------------------------------------------------------------------------------------

附錄:

一、接口說明

1. 創建套接字
  • 接口int socket(int domain, int type, int protocol);
    • domain:地址域,對于IPv4,使用AF_INET;對于IPv6,使用AF_INET6
    • type:套接字類型,對于UDP,使用SOCK_DGRAM
    • protocol:協議類型,通常設置為0,讓系統自動選擇UDP協議。
2. 綁定地址(僅服務端)
  • 接口int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
    • sockfd:套接字描述符,由socket()函數返回。
    • addr:指向sockaddr結構體的指針,通常使用sockaddr_in結構體來填充,包含IP地址和端口號。
    • addrlen:地址結構體的長度。
3. 發送數據
  • 接口ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);
    • sockfd:套接字描述符。
    • buf:指向要發送數據的緩沖區。
    • len:要發送數據的長度。
    • flags:發送選項,通常設置為0。
    • dest_addr:目標地址信息。
    • addrlen:目標地址信息的長度。
4. 接收數據
  • 接口ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);
    • sockfd:套接字描述符。
    • buf:接收數據的緩沖區。
    • len:緩沖區的最大長度。
    • flags:接收選項,通常設置為0。
    • src_addr:源地址信息(可選)。
    • addrlen:源地址信息的長度(輸入輸出型參數)。
5. 關閉套接字
  • 接口int close(int sockfd);
    • sockfd:套接字描述符。

二、UDP通信說明

UDP(User Datagram Protocol,用戶數據報協議)是一種無連接的協議。。

1、UDP通信過程

UDP通信過程主要包括創建套接字(socket)、綁定端口、發送數據和接收數據幾個步驟。在Linux環境中,UDP通信通常涉及到socket()創建套接字、bind()綁定本地IP地址和端口號、sendto()發送數據到指定地址、recvfrom()接收來自指定地址的數據。

2、UDP數據報結構

UDP數據報主要由報頭和數據兩部分組成,其中報頭包括源端口號、目的端口號、長度和校驗和四個字段,總共8個字節。UDP報頭保證了數據在傳輸過程中的封裝和基本的錯誤檢測。

3、常見問題:UDP丟包問題分析

? ? ? 原因可能包括網絡擁堵、防火墻過濾、緩沖區溢出等。可以通過查看系統的接收緩沖區和發送緩沖區的設置,以及相關的統計信息來分析和解決丟包問題。

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

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

相關文章

數據結構——排序算法(冒泡、快速、選擇、插入)

文章目錄 1. 概念 2. 十大排序算法 3. 冒泡排序 4. 冒泡代碼實現 5. 快速排序 6. 快速代碼實現 7. 選擇排序 8. 選擇代碼實現 9. 插入排序 10. 插入代碼實現 1. 概念 排序&#xff08;Sort&#xff09;是將無序的記錄序列&#xff08;或稱文件&#xff09;調整成有序…

LabVIEW前面板占滿整個屏幕(轉)

希望在運行一個LabVIEW程序時&#xff0c;它的前面板能夠占據整個屏幕&#xff0c;且不顯示Windows的任務欄或其他任何的LabVIEW菜單選項。怎樣才能實現這一功能&#xff1f; 您可以通過手動配置或編程的方式實現該功能。 手動配置VI屬性 您可以通過以下操作&#xff0c;將…

導入項目,JAVA文件是咖啡杯圖標

問題 從圖中可以看到&#xff0c;JAVA文件是咖啡杯圖標 原因 項目沒有識別為MAVEN項目 解決辦法 進入pom.xml文件&#xff0c;右鍵點擊Add as Maven Project即可

在Ubuntu 16.04上安裝和保護MongoDB的方法

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到網站。 簡介 MongoDB 是一個免費且開源的面向文檔的數據庫。它被歸類為 NoSQL 數據庫&#xff0c;因為它不依賴于傳統的基于表的關系型數據庫結…

Spring MVC入門3

看完這篇博客你能學到什么 理解JSON的使用理解注解PathVariable理解解注解RequestPart理解cookie和Session的基本概念理解cookie和Session的區別 如果想真正掌握&#xff0c;還需要自己勤加練習。 正文 JSON JSON概念 JSON&#xff1a;JavaScript Object Notation 【JavaS…

【YOLOv8】 用YOLOv8實現數字式工業儀表智能讀數(一)

上一篇圓形表盤指針式儀表的項目受到很多人的關注&#xff0c;咱們一鼓作氣&#xff0c;把數字式工業儀表的智能讀數也研究一下。本篇主要講如何用YOLOV8實現數字式工業儀表的自動讀數&#xff0c;并將讀數結果進行輸出&#xff0c;若需要完整數據集和源代碼可以私信。 目錄 &…

gin源碼分析

一、高性能 使用sync.pool解決頻繁創建的context對象&#xff0c;在百萬并發的場景下能大大提供訪問性能和減少GC // ServeHTTP conforms to the http.Handler interface. // 每次的http請求都會從sync.pool中獲取context&#xff0c;用完之后歸還到pool中 func (engine *Engin…

在C++中怎樣使用C庫

在C中使用C庫是一個相對直接的過程&#xff0c;因為C是從C發展而來的&#xff0c;并且與C高度兼容。這意味著你可以直接在C代碼中使用C庫函數、頭文件和變量&#xff0c;而無需進行特殊轉換。以下是一些基本的步驟和注意事項&#xff0c;用于在C中使用C庫&#xff1a; 1. 包含…

c語言位操作符相關題目之交換兩個數的值

文章目錄 一、題目二、方法11&#xff0c;思路2&#xff0c;代碼實現 三、方法21&#xff0c;思路2&#xff0c;代碼實現 四、方法31&#xff0c;思路2&#xff0c;代碼實現 總結 提示&#xff1a;以下是本篇文章正文內容&#xff0c;下面案例可供參考 一、題目 實現兩個變量的…

淺談PostCSS

1. 背景 css的預處理器語言&#xff08;比如 sass&#xff0c; less&#xff0c; stylus&#xff09;的擴展性不好&#xff0c;你可以使用它們已有的功能&#xff0c;但如果想做擴展就沒那么容易。 sass是很常用的css預處理器語言&#xff0c;在webpack中要使用它&#xff0c;…

設計模式使用場景實現示例及優缺點(結構型模式——組合模式)

結構型模式 組合模式&#xff08;Composite Pattern&#xff09; 組合模式使得用戶對單個對象和組合對象的使用具有一致性。 有時候又叫做部分-整體模式&#xff0c;它使我們樹型結構的問題中&#xff0c;模糊了簡單元素和復雜元素的概念&#xff0c;客戶程序可以像處理簡單元…

小米起訴“小米”商標侵權,索賠500萬!

近日浙江麗水有家叫小米的公司&#xff0c;因為商標侵權被小米科技起訴索賠500萬&#xff0c;需要變更企業名稱&#xff0c;官網也不能用“小米智能大家居”等&#xff0c;還有其它的賠償&#xff0c;普推知產商標老楊分析&#xff0c;“小米智能大家居”“小米”&#xff0c;后…

【Flask從入門到精通:第九課:數據庫基本操作、數據表操作以及數據操作】

數據庫操作 數據庫驅動&#xff08;drivers&#xff09;模塊&#xff1a;pymysql、MySQLDB 數據庫基本操作 在SQLAlchemy中&#xff0c;添加、修改、刪除操作&#xff0c;均由數據庫會話(sessionSM)管理。 會話用 db.session 表示。在準備把數據寫入數據庫前&#xff0c;要先…

交易平臺Zero Hash現已支持SUI交易

Zero Hash是一家領先的加密貨幣和穩定幣基礎設施平臺&#xff0c;為包括Stripe、Shift4和Franklin Templeton在內的公司提供支持&#xff0c;現在也支持對SUI的訪問。此舉使Zero Hash的客戶及其終端用戶能夠使用SUI。 提供API和SDK以及專注于無縫連接法幣、加密貨幣和穩定幣的…

讀人工智能全傳11人工智能會出什么錯

1. 人工智能會出什么錯 1.1. 一些報道是公正合理的&#xff0c;不過坦白地說&#xff0c;大部分報道都愚蠢得無可救藥 1.2. 一些報道頗有知識性和引導性&#xff0c;而大部分則是杞人憂天式的恐嚇 1.3. 滑稽的報道迎合了大眾對人工智能的“終結者式恐懼” 1.3.1. 我們創造出…

html設計(兩種常見的充電效果)

第一種 完整代碼&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title&…

方便快捷傳文件—搭建rsync文件傳輸服務器

比如我們有一個服務器&#xff0c;想把各個機器的文件都通過腳本傳給這臺機&#xff0c;用sftp或者直接rsync就必須輸密碼&#xff0c;肯定不行&#xff0c;做等效性免密又麻煩&#xff0c;怎么辦呢&#xff0c;這么辦&#xff01; 在服務端 yum -y install rsync #編輯&…

Vue3 關于scss預編譯中:deep 其中的deep如何理解

在SCSS預處理器中&#xff0c;:deep是一個偽類選擇器&#xff0c;用于選擇一個元素的所有后代元素&#xff0c;無論它們在DOM結構中的層級深度如何。換句話說&#xff0c;:deep選擇器是一個類似于CSS中的后代選擇器&#xff0c;但是它可以不考慮嵌套層級的限制&#xff0c;而是…

Android MessageQueue 源碼分析

類注釋 /*** Low-level class holding the list of messages to be dispatched by a* {link Looper}. Messages are not added directly to a MessageQueue,* but rather through {link Handler} objects associated with the Looper.** <p>You can retrieve the Messa…

【FineGrip】全光學感知:一種新的通用遙感圖像解釋任務和細粒度數據集(IEEE TGRS 2024)

摘要 目前的遙感解譯模型通常集中于單一的任務&#xff0c;如檢測、分割或字幕。但是&#xff0c;針對特定任務設計的模型無法實現綜合多層次解譯。該領域也缺乏多任務聯合解譯數據集。本文提出Panoptic Perception&#xff0c;一個新的任務和一個新的細粒度數據集&#xff08…