Linux網絡:UDP socket創建流程與簡單通信

本文介紹 UDP 服務端與客戶端 的創建流程,和相關的函數接口

核心流程

  1. 創建 socket → socket()
  2. 填寫服務器地址信息 → sockaddr_in 結構體
  3. 綁定地址和端口 → bind()
  4. 接收并響應客戶端數據 → recvfrom() / sendto()

在這里插入圖片描述

socket()

#include<sys/socket.h>
int socket(int domain, int type, int protocol);
參數說明
domain地址族(協議族),常見值:
AF_INET:IPv4
AF_INET6:IPv6
AF_UNIX:本地通信(進程間通信)
type套接字類型,決定通信方式:
SOCK_STREAM:面向連接(TCP)
SOCK_DGRAM:無連接(UDP)
protocol一般寫 0,表示讓系統自動選擇適合給定 domaintype 的協議

使用示例

int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
//成功返回文件描述符
//失敗返回-1
if (sockfd < 0)
{std::cerr << "socket error" << std::endl;
}

sockaddr_in

他有4個成員,賦值前三個即可

struct sockaddr_in {sa_family_t sin_family;   // 地址族,必須是 AF_INETuint16_t sin_port;        // 端口號(網絡字節序)struct in_addr sin_addr;  // IP 地址char sin_zero[8];         // 填充字節,保持與 sockaddr 一致
};

在賦值時需要注意,

  1. 端口號要轉換為網絡序列
  2. IP地址調用inet_addr
    server.sin_port = htons(serverport);                  // 主機序列轉網絡序列server.sin_addr.s_addr = inet_addr(serverip.c_str()); // 轉換4字節

INADDR_ANY

服務器端的服務需要固定的端口
而IP地址給INADDR_ANY,表示監聽任意IP地址,即從哪個網卡發來哪個請求都可以處理

其實和手動給0或者0.0.0.0 作用相似

bind()

服務器端和客戶端都需要將套接字和本地地址(IP+port)綁定,才能做到接收和轉發消息

int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
參數含義
sockfdsocket() 創建的套接字文件描述符
addr本地地址結構體(sockaddr* 類型,實際通常傳 sockaddr_in* 轉換而來)
addrlen結構體 addr 的大小(用 sizeof(sockaddr_in)

使用示例

int n = bind(_sockfd, (struct sockaddr *)&addr, sizeof(addr));
//成功返回0,失敗返回-1
if (n < 0)
{LOG(FATAL, "bind error, %s, %d\n", strerror(errno), errno);exit(BIND_ERROR);
}

客戶端的bind()

客戶端也是需要綁定的,不然如何發送消息呢。

但是,不需要我們手動調用bind(),
在第一次發送請求的時候,OS自動調用bind()

當你第一次調用:  sendto()操作系統會自動調用 bind() 來:1.分配一個臨時的本地 IP(通常是默認網卡的 IP)2.分配一個 可用的隨機端口(稱為 ephemeral port)

recvfrom()

recvfrom() 是 UDP 套接字編程中用來接收數據報的核心函數,
它不僅接收數據,還能告訴你數據是從哪個客戶端發來的

#include<sys/socket.h>
#include<sys/types.h>
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);
參數含義
sockfd套接字文件描述符(由 socket() 創建)
buf指向緩沖區的指針,用來存放接收到的數據
len緩沖區大小
flags一般設置為 0,特殊需求可用 MSG_PEEK(窺視)、MSG_WAITALL
src_addr輸出參數,對方的地址結構體(可獲取對方 IP 和端口)
addrlen輸入輸出參數,傳入結構體長度,返回時寫入實際地址大小

使用示例

struct sockaddr_in peer;
socklen_t len = sizeof(peer);
char buffer[1024];
ssize_t n = recvfrom(_sockfd, buffer, sizeof(buffer) - 1, 0, (struct sockaddr *)&peer, &len);
//成功返回實際接收的字節數(就是多少個英文字符)
//失敗返回-1
//peer存客戶端的數據

sendto()

#include<sys/socket.h>
#include<sys/types.h>
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen);

有區別的是len、det_addr

參數含義
sockfd套接字文件描述符(由 socket() 創建)
buf要發送的數據緩沖區的指針
len要發送的數據字節數
flags通常為 0,特殊用途可以設置為 MSG_CONFIRM
dest_addr目標地址結構體(例如 sockaddr_in,需強轉為 sockaddr*
addrlendest_addr 的長度(如 sizeof(sockaddr_in)

使用示例

struct sockaddr_in peer;
socklen_t len = sizeof(peer);
//客戶端要持續運行,所以給死循環
while (true)
{char buffer[1024];ssize_t n = recvfrom(_sockfd, buffer, sizeof(buffer) - 1, 0, (struct sockaddr *)&peer, &len);if (n > 0){buffer[n] = {0};InetAddr addr(peer);	//自己寫的類,為了獲取轉換后的網絡字節序和4字節序LOG(DEBUG, "get message from [%s:%d]:%s\n", addr.Ip(), addr.Port(), buffer);sendto(_sockfd, buffer, strlen(buffer), 0, (struct sockaddr *)&peer, len);}
}

小結

介紹了socket創建流程需要的接口,以及在這方面服務器端和客戶端的區別

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

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

相關文章

windows內核研究(系統調用 1)

WindowsAPI函數的調用過程什么是WindowsApi&#xff1f;Windows API&#xff08;Application Programming Interface&#xff0c;應用程序編程接口&#xff09;是微軟為Windows操作系統提供的一套系統級編程接口&#xff0c;允許開發者與操作系統內核、硬件、系統服務等進行交互…

【前端】異步任務風控驗證與輪詢機制技術方案(通用筆記版)

一、背景場景 在某類生成任務中&#xff0c;例如用戶點擊“執行任務”按鈕后觸發一個較耗時的后端操作&#xff08;如生成報告、渲染圖像、轉碼視頻等&#xff09;&#xff0c;由于其調用了模型、渲染服務或需要較長處理時間&#xff0c;為了防止接口被頻繁惡意調用&#xff0c…

Vim 編輯器常用操作詳解(新手快速上手指南)

&#x1f4bb; Vim 編輯器常用操作詳解&#xff08;新手快速上手指南&#xff09;作者&#xff1a;Lixin 日期&#xff1a;2025-07-09 學習內容&#xff1a;Vim 編輯器基礎 常用快捷鍵 Xshell/Xftp連接 Linux基本操作 學習目標&#xff1a;掌握 Vim 的三種常用模式切換與基本…

OpenGL 生成深度圖與點云

文章目錄 一、簡介二、實現代碼三、實現效果一、簡介 這里基于OpenGL實現對一個Mesh對象深度圖的獲取,思路其實很簡單,直接通過glReadPixels函數獲取整個OpenGL中的深度緩沖數據即可;那么反過來我們如果有了這個深度圖之后,也可以基于每個像素點的深度值,反算出圖像中的深…

25春云曦期末考復現

Web 瘋狂星期四 <?php$tg1u$_GET[tg1u];if(!preg_match("/0|1|[3-9]|\~|\|\|\#|\\$|\%|\^|\&|\*|\&#xff08;|\&#xff09;|\-|\|\|\{|\[|\]|\}|\:|\|\"|\,|\<|\.|\>|\/|\?|\\\\|localeconv|pos|current|print|var|dump|getallheaders|get|define…

從Prompt到預訓練:掌握大模型核心技術的階梯式進化

本文較長&#xff0c;建議點贊收藏&#xff0c;以免遺失。更多AI大模型應用開發學習視頻及資料&#xff0c;盡在聚客AI學院。 在探討大模型&#xff08;LLM&#xff09;的四階段技術時&#xff0c;我們可以從Prompt Engineering&#xff08;提示工程&#xff09;、AI Agent&…

手機文件夾隱藏工具,一鍵保護隱私

軟件介紹 今天為大家推薦一款手機文件夾隱藏工具——Amarok&#xff0c;它能幫助用戶快速隱藏手機中的私密文件夾&#xff0c;保護個人隱私。 核心功能 Amarok主打文件夾隱藏功能&#xff0c;操作簡單便捷。需要注意的是&#xff0c;雖然軟件支持應用隱藏功能&#xff0…

day10-Redis面試篇

經過前幾天的學習&#xff0c;大家已經掌握了微服務相關技術的實際應用&#xff0c;能夠應對企業開發的要求了。不過大家都知道在IT領域往往都是面試造火箭&#xff0c;實際工作擰螺絲。為了更好的應對面試&#xff0c;讓大家能拿到更高的offer&#xff0c;我們接下來就講講“造…

Axure版本Element組件庫-免費版

Axure版本的Element組件庫基于Element UI/Plus設計規范開發&#xff0c;涵蓋了從基礎元素到復雜交互的全品類組件&#xff0c;能高效支撐各類Web原型設計&#xff0c;尤其適合后臺管理系統、企業級應用等場景。以下從核心類別展開詳細介紹&#xff1a; 鏈接地址 添加圖片注釋&a…

記一次JVM問題排查

今天遇到了1次OOM&#xff0c;導入萬條數據的Excel于是讓運維進行排查。正式環境顯示內存還有很多 于是我說讓運維加上參數 -XX:HeapDumpOnOutOfMemoryError&#xff0c;出現OOM的時候dump到文件中&#xff0c;將堆內存設置為4G&#xff0c;在Idea上進行測試于是讓運維在生產環…

快手Kwai Keye-VL多模態大模型模型架構、訓練策略、數據情況

快速看一下Kwai Keye-VL的技術報告&#xff0c; 模型架構 Keye-VL和經典的MLLM架構類似&#xff0c;由ViTMLPLLM組成。視覺側有兩點可以看看&#xff1a; 1、具有原生分辨率的視覺編碼器 提到&#xff0c;MLLMs使用預訓練的固定分辨率ViT作為視覺編碼器。然而&#xff0c;這…

前端-CSS-day2

目錄 1、后代選擇器 2、子代選擇器 3、并集選擇器 4、交集選擇器 5、偽類選擇器 6、超鏈接偽類 7、CSS特性-繼承性 8、CSS特性-層疊性 9、CSS特性-優先級 10、優先級-疊加計算 11、Emmet寫法 12、背景圖 13、背景圖平鋪方式 14、背景圖位置 15、背景圖縮放 16、…

米思齊2.0 3.0 mixly arduino 編程軟件下載安裝及詳情使用指南 導入庫文件方法 支持8266 esp32

一、米思齊軟件下載及安裝 1、 米思齊軟件下載 https://item.taobao.com/item.htm?id883253312209 2、軟件版本簡單說明&#xff1a; a、 Windows版本&#xff08;建議win10及以上系統使用&#xff09;&#xff1a; 一鍵更新完整版 2.8GB-3GB&#xff1a;下載后解壓即可使…

結構體指針:使用結構體指針訪問和修改結構體成員。

知識點結構體指針Employee *p; 保存結構體的地址&#xff1b;p->member 用箭頭運算符訪問或修改成員。數組與指針Employee *emps malloc(N * sizeof *emps); 動態創建結構體數組&#xff1b;p < emps N 與 p 配合遍歷。scanf 與數組退化p->name 是 char name[50] 的…

支持零樣本和少樣本的文本到語音48k star的配音工具:GPT-SoVITS-WebUI

支持零樣本和少樣本的文本到語音48k star的配音工具&#xff1a;GPT-SoVITS-WebUI 官網&#xff1a;RVC-Boss/GPT-SoVITS: 1 min voice data can also be used to train a good TTS model! (few shot voice cloning) 用戶手冊&#xff1a;GPT-SoVITS指南 功能 零樣本文本到語…

基于odoo17的設計模式詳解---備忘模式

大家好&#xff0c;我是你的Odoo技術伙伴。在開發復雜的業務流程時&#xff0c;我們有時會遇到這樣的需求&#xff1a;在對一個對象進行一系列復雜操作之前&#xff0c;保存其當前狀態&#xff0c;以便在操作失敗或用戶希望撤銷時&#xff0c;能夠一鍵恢復到操作之前的樣子。或…

基于Web門戶架構的監獄內網改版實踐:值班排班系統設計與信創適配探討

面向監獄內網改版場景的門戶平臺技術架構與智能排班實踐關鍵詞&#xff1a;監獄內網改版、監獄內部網站改版、值班排班系統、信創適配、智能門戶架構一、場景背景與問題分析 在信創國產化、等級保護合規、政務集約化趨勢持續推進的背景下&#xff0c;傳統監獄內部網站普遍面臨如…

二分查找篇——在排序數組中查找元素的第一個和最后一個位置【LeetCode】

34. 在排序數組中查找元素的第一個和最后一個位置 一、算法邏輯&#xff08;逐步通順講解每一步思路&#xff09; 該算法用于在一個升序排列的數組 nums 中查找某個目標值 target 的第一個出現的位置和最后一個出現的位置。 ? 1?? 定義 lower_bound 函數 def lower_boun…

【深度學習新浪潮】AI在材料力學領域的研究進展一覽

一、材料力學的研究范疇 材料力學是固體力學的核心分支,聚焦于材料在載荷作用下的變形、失效規律及性能優化,其核心任務是揭示材料的強度、剛度和穩定性機制。具體研究內容包括: 基本力學行為:分析桿、梁、軸等結構在拉伸、壓縮、彎曲、扭轉等載荷下的應力分布與應變響應。…

WPF之命令

命令的定義&#xff1a;命令與事件的區別&#xff1a;命令是具有約束性的。命令還可以控制接收者"先做校驗&#xff0c;再保存&#xff0c;再關閉"。命令&#xff1a;WPF的命令&#xff0c;實際上就是實現了ICommand接口的類&#xff0c;平時使用最多的是RoutedComma…