套接字編程UDP

1.創建套接字

int socket(int domain, int type, int protocol);
第一個參數,底層用的ip報文統一使用的網絡協議都是AFIN
第二個參數,面向流的傳輸協議
SOCK_DGRAM(數據報套接字類型):支持數據報(無連接、不可靠且具有固定最大長度的消息 )
第三個參數,設置為0
創建成功返回一個文件描述符,創建失敗返回-1

2.綁定socket信息,ip和端口

2.1 填充sockaddr_in 結構體

????????IP信息和端口信息一定要發送到網絡
?????????

(1)本地格式轉化成網序列

? ?
local.sin_port = htons(_port);
將本地字節序(也叫主機字節序 )的端口號,轉換為網絡字節序(大端序 高字節存低地址,低字節存高地址),從而讓端口號能在網絡通信中正確識別和傳輸
eg:主機是小端序(如常見的 x86 架構 ),_port 的值是 8080(十進制 ),在主機內存中以小端序存儲(低字節在前 ),二進制可能表示為 0x1F 0x20(十六進制拆分 )。經過 htons 轉換后,會變成大端序的 0x20 0x1F ,然后賦值給 local.sin_port ,滿足網絡字節序要求

(2)ip也是一樣

1. ip轉化為4字節
2. 4字節轉化為網絡序列
1.點分十進制 -> 4字節二進制(主機字節序)
eg:IP 地址 192.168.1.100
192 -> 11000000
168 ->?10101000
1? ? ?->? 00000001
100 ->? 01100100
得到32位二進制? (4字節)
11000000 10101000 00000001 01100100
2. 4字節 -> 大端序
就能存到 sockaddr_in 結構體的 sin_addr.s_addr 成員里,供網絡操作使用
local.sin_addr.s_addr = inet_addr(_ip.c_str());
函數申明?in_addr_t inet_addr(const char *cp);
在實際編程中,我們不需要手動寫 in_addr_t inet_addr(const char *cp); 這個聲明,而是通過包含頭文件 #include <arpa/inet.h> 來獲取該函數的聲明
函數調用??local.sin_addr.s_addr = inet_addr(_ip.c_str());
local.sin_addr.s_addr = inet_addr("192.168.1.100");
不管是內網還是公網的客戶端,都能訪問到服務,就可以用 INADDR_ANY ,不用關心具體綁定哪個 IP

INADDR_ANY 的核心作用就是讓服務器「綁定到本機所有可用的網絡接口」,從而實現:

無論客戶端通過服務器的公網 IP、內網 IP 還是本地回環地址(127.0.0.1) 發送請求,只要端口正確,服務器都能接收到。
無需提前知道服務器有哪些 IP 地址(比如服務器可能有多個網卡,或 IP 是動態分配的),簡化配置

recvfrom 和 sendto 函數

服務器要顯示bind,ip和端口號必須是眾所周知且不能輕易改變的
1. 收消息,客戶端要給服務器發消息,為了讓服務端處理數據
recvfrom 接收數據
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,?struct sockaddr *src_addr, socklen_t *addrlen);

client的bind

client要訪問目標服務器,需要知道服務器ip和端口,而客戶端和服務器是同一家公司寫的,就能知道
客戶端需要bind即使是客戶端,發送數據時也需要一個「源端口」,讓服務器能通過 recvfrom 獲取客戶端的端口。但不要顯示地bind,首次發消息,os會自動給client進行bind,os知道ip,os隨機選擇端口號,只要端口號是唯一的就可以

(1)服務端必須「顯式綁定」
服務端需要一個固定、已知的端口(比如 80、8080),讓客戶端能主動連接。因此必須手動 bind:

(2)客戶端可以「隱式綁定」
客戶端不需要固定端口(端口由系統自動分配),因此可以省略 bind 操作。當客戶端第一次調用 sendto 或 recvfrom 時:

操作系統會自動為客戶端分配一個隨機的空閑端口(通常在 1024~65535 范圍內)
同時自動綁定客戶端的 IP(通常是本機 IP,如 192.168.1.100)


操作系統會自動完成以下步驟:

檢查客戶端套接字是否已綁定端口:
如果未綁定,進入「自動綁定流程」。
分配隨機端口:
從 1024~65535 中選一個未被占用的端口(類似臨時端口分配)。
綁定客戶端 IP:
自動綁定到客戶端的「默認出網 IP」(可能是 127.0.0.1 或本機真實 IP,由路由策略決定)


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

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

相關文章

計算機網絡:如何判斷B或者C類IP地址是否劃分了子網

要判斷B類或C類IP地址是否劃分了子網,核心在于通過子網掩碼分析其網絡位長度是否超過該類地址的默認網絡位長度。以下是具體的判斷方法和細節說明: 一、基礎概念:IP地址類別與默認網絡位 IP地址分為A、B、C三類(常用),每類地址的默認網絡位長度(即未劃分子網時,用于標…

智慧農業溫室大棚物聯網遠程監控與智能監測系統

一、痛點破局&#xff1a;從“靠天吃飯”到“知天而作”傳統溫室大棚管理依賴人工巡檢與經驗判斷&#xff0c;存在三大核心痛點&#xff1a;數據孤島&#xff1a;溫濕度、光照、CO?濃度等關鍵參數分散于不同設備&#xff0c;難以實時整合分析&#xff1b;響應滯后&#xff1a;…

PID學習筆記1

在學習江協科技PID課程時&#xff0c;做一些筆記&#xff0c;對應視頻1-4&#xff0c;對應代碼&#xff1a;02&#xff0c;03&#xff0c;04&#xff0c;0502-位置式PID定速控制main.c:#include "stm32f10x.h" // Device header #include "Del…

C++入門學習3

10.類和對象 C語言結構體中只能定義變量&#xff0c;在C中&#xff0c;結構體內不僅可以定義變量&#xff0c;也可以定義函數。 C中定義類&#xff08;結構體&#xff09;的語法&#xff1a; class className {// 類體&#xff1a;由成員函數和成員變量組成}; // 一定要注意…

奇偶校驗碼原理與FPGA實現

奇偶校驗原理與FPGA實現寫在前面一、基礎原理2.1 奇校驗2.2 偶校驗2.3 缺點二、舉個例子3.1 奇校驗例子3.2 偶校驗例子3.3 檢測出錯例子三、FPGA實現寫在后面寫在前面 奇偶校驗碼是一種簡單的檢錯碼&#xff0c;主要用于數據傳輸或存儲過程中檢測奇數個比特錯誤或者偶數個比特錯…

Python中的Lambda函數詳解

Lambda函數&#xff08;匿名函數&#xff09;是Python中一種簡潔的函數定義方式&#xff0c;它允許你快速創建小型、一次性的函數對象而無需使用標準的def關鍵字。1. Lambda函數的基本語法lambda arguments: expressionlambda&#xff1a;定義匿名函數的關鍵字arguments&#x…

進階向:Python編寫網頁爬蟲抓取數據

Python網頁爬蟲入門指南&#xff1a;從零開始抓取數據在當今數據驅動的時代&#xff0c;網絡爬蟲已成為獲取公開信息的重要工具。Python憑借其豐富的庫和簡潔的語法&#xff0c;成為編寫網絡爬蟲的首選語言。本文將詳細介紹如何使用Python編寫一個基礎的網頁爬蟲。什么是網頁爬…

客服Agent革命:智能客服系統的技術實現與效果評估

客服Agent革命&#xff1a;智能客服系統的技術實現與效果評估 &#x1f31f; Hello&#xff0c;我是摘星&#xff01; &#x1f308; 在彩虹般絢爛的技術棧中&#xff0c;我是那個永不停歇的色彩收集者。 &#x1f98b; 每一個優化都是我培育的花朵&#xff0c;每一個特性都是我…

C++-紅黑樹

1、紅黑樹的概念紅黑樹&#xff0c;是一種二叉搜索樹&#xff0c;但在每個結點上增加一個存儲位表示結點的顏色&#xff0c;可以是Red或 Black。 通過對任何一條從根到葉子的路徑上各個結點著色方式的限制&#xff0c;紅黑樹確保沒有一條路 徑會比其他路徑長出倆倍&#xff0c;…

在Python中避免使用`None`表示特殊情況:函數返回值與異常處理的最佳實踐 (Effective Python 第20條)

在Python編程中&#xff0c;函數的設計與實現直接影響代碼的可讀性、可維護性和健壯性。一個常見的問題是如何處理函數的返回值&#xff0c;尤其是在需要表示某種特殊或異常情況時。許多開發者習慣性地使用None來表示這些特殊情況&#xff0c;但這種方法往往會導致意想不到的錯…

從反射到方法句柄:深入探索Java動態編程的終極解決方案

&#x1f31f; 你好&#xff0c;我是 勵志成為糕手 &#xff01; &#x1f30c; 在代碼的宇宙中&#xff0c;我是那個追逐優雅與性能的星際旅人。 ? 每一行代碼都是我種下的星光&#xff0c;在邏輯的土壤里生長成璀璨的銀河&#xff1b; &#x1f6e0;? 每一個算法都是我繪制…

算法_python_學習記錄_01

人心的成見是一座大山。一旦有山擋在面前&#xff0c;則很難到達下一站。所需要做的&#xff0c;是穿過這座山。 偶然間看了一個視頻&#xff0c;說的是EMASMA的自動交易策略&#xff0c;這個視頻做的很用心&#xff0c;在入場的時間不僅要看EMA的金叉&#xff0c;還需要看其他…

機器翻譯中的語言學基礎詳解(包括包括語法、句法和語義學等)

文章目錄一、語法&#xff08;Grammar&#xff09;&#xff1a;語言規則的底層框架1.1 傳統語法理論的應用1.2 生成語法&#xff08;Generative Grammar&#xff09;1.3 依存語法&#xff08;Dependency Grammar&#xff09;二、句法&#xff08;Syntax&#xff09;&#xff1a…

MQTT:Dashboard訪問授權

目錄一、認證1.1 創建認證器1.2 多認證器二、授權2.1 ACL文件授權配置2.2 使用內置數據庫授權配置一、認證 認證&#xff1a;就是驗證客戶端的身份。 1.1 創建認證器 選擇認證方式配置數據源配置數據源的相關參數 認證器創建之后&#xff0c;在使用客戶端連接Dashboard時&am…

Serper注冊無反應

google郵箱才行&#xff0c;163郵箱注冊無反應&#xff0c;其他郵箱沒試過 在嘗試websailor系列的時候&#xff0c;需要注冊serper&#xff0c;獲取Google Search Key serper.dev/dashboard

聊聊經常用的微服務

聊聊微服務 架構演變 單體架構&#xff1a; All in One&#xff0c;所有的功能模塊都在一個工程里。 SOA架構&#xff1a; 這個架構當不當正不正&#xff0c;對于現在來說&#xff0c;有點老&#xff0c;甚至需要ESB&#xff0c;WebService之類的&#xff0c;基本不會使用了。…

第十四屆藍橋杯青少年組省賽 編程題真題題解

明天我就要考藍橋杯省賽了&#xff0c;本蒟蒻已瑟瑟發抖&#xff0c;所以現在寫一篇文章。 題目分別為&#xff1a; 1.??????B4270 [藍橋杯青少年組省賽 2023] 特殊運算符 2.B4271 [藍橋杯青少年組省賽 2023] 四葉玫瑰數 3.B4272 [藍橋杯青少年組省賽 2023] 質因數的…

HTML全景效果實現

我將為您創建一個精美的360度全景效果頁面&#xff0c;使用Three.js庫實現沉浸式全景體驗&#xff0c;并提供用戶友好的控制界面&#xff0c;完整代碼看文章末尾。 設計思路 使用Three.js創建全景球體 添加控制面板用于切換不同場景 實現自動旋轉和手動控制選項 添加加載狀…

Python 屬性描述符(描述符用法建議)

描述符用法建議 下面根據剛剛論述的描述符特征給出一些實用的結論。 使用特性以保持簡單 內置的 property 類創建的其實是覆蓋型描述符&#xff0c;__set__ 方法和 __get__ 方法都實現了&#xff0c;即便不定義設值方法也是如此。特性的 __set__ 方法默認拋出 AttributeError: …

Milvus 向量數據庫內存使用相關了解

1、支持 MMap 的數據存儲在 Milvus 中&#xff0c;內存映射文件允許將文件內容直接映射到內存中。這一功能提高了內存效率&#xff0c;尤其是在可用內存稀缺但完全加載數據不可行的情況下。這種優化機制可以增加數據容量&#xff0c;同時在一定限度內確保性能&#xff1b;但當數…