Linux 軟件編程(九)網絡編程:IP、端口與 UDP 套接字

1. 學習目的

實現 不同主機之間的進程間通信

在 Linux 下,進程間通信(IPC)不僅可以發生在同一臺主機上,也可以通過網絡實現不同主機之間的通信。要做到這一點,必須同時滿足以下兩個條件:

  1. 物理層面:不同主機之間必須通過物理網絡互聯互通(如網線、交換機、路由器等)。

  2. 軟件層面:進程之間必須通過網絡協議進行通信。


2. 基礎概念

  • IP 地址
    計算機的“軟件地址”,用來標識計算機設備

  • MAC 地址
    計算機網卡的“硬件地址”,唯一且固定。

  • 端口號
    用來區分同一主機上的不同進程,保證多個網絡服務可以同時運行。


3. 網絡協議

網絡通信需要遵循統一的標準,即 網絡協議

3.1 OSI 七層模型(理論模型)

OSI(Open System Interconnect)是一個通信標準框架,分為 7 層:

  1. 應用層:提供應用服務(如文件傳輸、電子郵件)。

  2. 表示層:數據加密/解密,壓縮/解壓縮。

  3. 會話層:建立數據傳輸通道, ? ---》會話

  4. 傳輸層:提供端到端的傳輸服務(傳輸的方式 ?UDP ?TCP ? 端口號)。

  5. 網絡層:實現數據路由,路徑規劃 ? ?路由器 ?ip。

  6. 數據鏈路層:封裝成幀,點對點通信(局域網內通信),差錯檢測 ? 交換機 ?ARP。

  7. 物理層:定義物理介質(網線、光纖),傳輸比特流(0/1)。


3.2 TCP/IP 模型(應用模型)

相比 OSI 七層,TCP/IP 模型更貼近實際應用。

五層模型
  1. 應用層

    • HTTP:超文本傳輸協議

    • HTTPS:加密的 HTTP(SSL加密算法)

    • FTP:文件傳輸協議(TCP)

    • TFTP:簡單文件傳輸協議(UDP)

    • MQTT:物聯網協議

    • DNS:域名解析服務

  2. 傳輸層

    • TCP(傳輸控制協議,可靠,面向連接)

    • UDP(用戶數據報協議,不可靠,面向無連接)

  3. 網絡層

    • IP 協議(IPv4 / IPv6)

  4. 數據鏈路層

    • ARP(地址解析協議)

  5. 物理層

四層模型
  1. 應用層

  2. 傳輸層

  3. 網絡層

  4. 網絡接口層


4. IP 協議

  • IPv4:32 位地址

  • IPv6:128 位地址

4.1 表示方式

  • 點分十進制:192.168.1.140? (用戶表示形式) ? 點分十進制 ??

  • 二進制存儲:11000000 10101000 00000000 10001100? ?(計算機存儲形式) 32bits

4.2 IP 地址組成

IP地址 = 網絡位 + 主機位

例:192.168.0.121/24

  • /24:網絡位長度 24 位

  • 網絡位:表示屬于哪個網段

  • 主機位:表示網段中(局域網)的哪一臺主機

4.3 子網掩碼

例:255.255.255.0

  • 11111111.11111111.11111111.00000000
    用來區分IP地址的網絡位和主機位,搭配IP地址使用。
    子網掩碼是1的部分對應IP地址的網絡位
    子網掩碼是0的部分對應IP地址的主機位


4.4 特殊地址

? ? ? ? ? ? IP地址網絡位不變,主機位全為0,則為該IP地址的網段號
192.168.1.3
255.255.0.0
192.168.0.0
位于
192.168.1.0 網段內(網段內的IP能直接通信)

? ? ? ? ? ? ???192.168.1.255
IP地址網絡位不變,主機位全為1,則為該IP地址的廣播號
192.168.1.3
255.255.255.0
廣播號:
192.168.1.255(向廣播號發送信息,所有局域網內IP都能收到此信息)

  • 網段號:主機位全為 0

  • 廣播號:主機位全為 1,局域網內所有主機都能收到

  • 網關地址:通常為 xxx.xxx.xxx.1,用于不同網段間通信


4.5 IP 地址分類

  1. A 類地址

    • 范圍:1.0.0.0 - 126.255.255.255
      子網掩碼:255.0.0.0 ? ? ? ? ?126*2^24 ? ? ? ?
      用于管理大規模網絡

      私有IP地址:10.0.0.0 - 10.255.255.255

      127.0.0.0 ? 回環地址

  2. B 類地址

    • 范圍:128.0.0.0 - 191.255.255.255
      子網掩碼:255.255.0.0 ? ? ? ? 2^16
      管理大中規模網絡

      私有IP地址:172.16.0.0 - 172.31.255.255

  3. C 類地址

    • 范圍:192.0.0.0 - 223.255.255.255
      子網掩碼:255.255.255.0 ? ? ? ?2^8
      管理中小規模網絡

      私有IP地址:192.168.0.0 - 192.168.255.255

  4. D 類地址

    • 224.0.0.0 - 239.255.255.255
      組播和廣播使用

  5. E 類地址

    • 240.0.0.0 - 255.255.255.254
      用來進行實驗

? ? ? ?公有IP:由電信公司直接分配,并需要付費的IP地址, 可以直接訪問internet
私有IP:不能直接訪問internet的ip地址

節省ip地址


5. 網絡端口號

  • 端口號:16 位無符號整數(0 - 65535)

  • 功能:區分同一主機上的不同網絡進程

分類

  1. 系統端口(0-1023)

    • HTTP:80

    • FTP:20/21

    • TFTP:69

    • HTTPS:443

  2. 注冊端口(1024-49151)

    • MQTT:1883 / 8883

  3. 動態端口(49152-65535)

    • 私有、臨時使用


6. Linux 網絡配置

常用命令

  1. ping ip/域名
    測試與目標主機是否連通

    ping www.baidu.com

  2. ifconfig(Linux)
    查看當前主機 IP 地址

    ipconfig(Windows)
    查看 Windows 主機 IP 地址


虛擬機配置

  1. 虛擬機 → 設置 → 網絡適配器 → 橋接模式

  2. 編輯 → 虛擬網絡編輯器 → VMnet0 → 橋接至當前 PC 網卡

  3. 修改網絡配置文件(示例)

    sudo vim /etc/network/interfaces

    auto lo

    iface lo inet loopback

    auto ens33

    iface ens33 inet dhcp

  4. 重啟網絡服務

    sudo /etc/init.d/networking restart

  5. 測試

    ping www.baidu.com


7. UDP 協議與編程

  • UDP(User Datagram Protocol)屬于傳輸層協議。

  • ?用戶數據報協議(User Datagram Protocol)

  • 特點:無連接、不可靠、效率高,適合實時性強的應用(如視頻、語音)。

7.1 網絡編程模型

  1. B/S 模型(Browser / Server)

    • 客戶端通用(瀏覽器)

    • 一般只開發服務器端

    • 客戶端的數據均來自服務器

  2. C/S 模型(Client / Server)

    • 專用客戶端

    • 服務器和客戶端都需開發

    • 客戶端可保存部分資源,本地加載


7.2 UDP 編程流程

基本概念
  • 套接字(socket):一個文件描述符,應用層與網絡通信的接口。

編程步驟

  • 客戶端

    1. 創建 socket

    2. 填寫服務器地址結構

    3. 發送數據 sendto

    4. 接收數據 recvfrom

    5. 關閉 socket

  • 服務器

    1. 創建 socket

    2. 綁定端口 bind

    3. 循環接收數據 recvfrom

    4. 可選擇回應客戶端 sendto

    5. 關閉 socket

#include <sys/types.h> ? ? ? ? ?/* See NOTES */
#include <sys/socket.h>

? ? ? ?int socket(int domain, int type, int protocol);
功能:創建通信的套接字
參數:
domain:網絡層使用什么協議族
AF_INET:IPv4
AF_INET6:IPv6
type:規定傳輸層的協議
SOCK_DGRAM : UDP協議
SOCK_STREAM:TCP協議
SOCK_RAW :原始套接字
protocol :0 按照默認協議方式創建
返回值:
成功:套接字
失敗:-1

? ? ? ?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:接收方的地址信息(IP+端口號)
addrlen:接收方地址的大小
返回值:
成功:實際發送的字節數
失敗:-1

? ? ? ?man 7 ip
struct sockaddr_in {
sa_family_t ? ?sin_family; /* address family: AF_INET */
in_port_t ? ? ?sin_port; ? /* port in network byte order */
struct in_addr sin_addr; ? /* internet address */
};

? ? ? ? ? ?/* Internet address. */
struct in_addr {
uint32_t ? ? ? s_addr; ? ? /* address in network byte order */
};


網絡字節序:大端 ? ? ? ? ? ? ? ?network
主機字節序:小端 ?50000 ? host

0x1234

小端:0x34
0x12
大端:
0x12
0x34

uint32_t htonl(uint32_t hostlong); ? ? ? ? ?主機轉網絡
uint16_t htons(uint16_t hostshort); ? ? ? ? 主機轉網絡
uint32_t ntohl(uint32_t netlong); ? ? ? ? ? 網絡轉主機
uint16_t ntohs(uint16_t netshort); ? ? ? ? ?網絡轉主機

?in_addr_t inet_addr(const char *cp);
功能:
將字符串IP地址轉換成二進制IP地址形式

?char *inet_ntoa(struct in_addr in);
功能:
將二進制ip轉換成字符串


int bind(int sockfd, const struct sockaddr *addr,
socklen_t addrlen);
功能:綁定自己的IP地址和端口號
參數:
sockfd:套接字
addr:需要綁定的地址
addrlen:地址大小
返回值:
成功:0
失敗:-1


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:發送發地址的指針
功能:
成功:實際接收到的字節數
失敗:-1

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

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

相關文章

5.Kotlin作用于函數let、run、with、apply、also

選擇建議 需要返回值&#xff1a;使用 let、run 或 with配置對象&#xff1a;使用 apply附加操作&#xff1a;使用 also非空檢查&#xff1a;使用 let鏈式調用&#xff1a;使用 let 或 run Kotlin作用域函數詳解 概述 Kotlin提供了5個作用域函數&#xff1a;let、run、with、ap…

嵌入式學習日記(32)Linux下的網絡編程

1. 目的不同主機&#xff0c;進程間通信。2. 解決的問題1&#xff09;. 主機與主機之間物理層面必須互聯互通。2.&#xff09; 進程與進程在軟件層面必須互聯互通。IP地址&#xff1a;計算機的軟件地址&#xff0c;用來標識計算機設備 MAC地址&#xff1a;計算機的硬件地址&…

C#_接口設計:角色與契約的分離

2.3 接口設計&#xff1a;角色與契約的分離 在軟件架構中&#xff0c;接口&#xff08;Interface&#xff09;遠不止是一種語言結構。它是一份契約&#xff08;Contract&#xff09;&#xff0c;明確規定了實現者必須提供的能力&#xff0c;以及使用者可以依賴的服務。優秀的接…

vsCode或Cursor 使用remote-ssh插件鏈接遠程終端

一、Remote-SSH介紹Remote-SSH 是 VS Code 官方提供的一個擴展插件&#xff0c;允許開發者通過 SSH 協議連接到遠程服務器&#xff0c;并在本地編輯器中直接操作遠程文件&#xff0c;實現遠程開發。它將本地編輯器的功能&#xff08;如語法高亮、智能提示、調試等&#xff09;與…

C語言實戰:從零開始編寫一個通用配置文件解析器

資料合集下載鏈接: ?https://pan.quark.cn/s/472bbdfcd014? 在軟件開發中,我們經常需要將一些可變的參數(如數據庫地址、端口號、游戲角色屬性等)與代碼本身分離,方便日后修改而無需重新編譯整個程序。這種存儲配置信息的文件,我們稱之為配置文件。 一、 什么是配置…

車機兩分屏運行Unity制作的效果

目錄 效果概述 實現原理 完整實現代碼 實際車機集成注意事項 1. 顯示系統集成 多屏顯示API調用 代碼示例&#xff08;AAOS副駕屏顯示&#xff09; 2. 性能優化 GPU Instancing 其他優化技術 3. 輸入處理 觸控處理 物理按鍵處理 4. 安全規范 駕駛員側限制 乘客側…

vivo“空間計算-機器人”生態落下關鍵一子

出品 | 何璽排版 | 葉媛不出所料&#xff0c;vivo Vision熱度很高。從21號下午發布到今天&#xff08;22號&#xff09;&#xff0c;大眾圍繞vivo Vision探索版展開了多方面的討論&#xff0c;十分熱烈。從討論來看&#xff0c;大家現在的共識是&#xff0c;MR行業目前還處于起…

Azure TTS Importer:一鍵導入,將微軟TTS語音接入你的閱讀軟件!

Azure TTS Importer&#xff1a;一鍵導入&#xff0c;將微軟TTS語音接入你的閱讀軟件&#xff01; 文章來源&#xff1a;Poixe AI 厭倦了機械、生硬的文本朗讀&#xff1f;想讓你的閱讀軟件擁有自然流暢的AI語音&#xff1f;今天&#xff0c;我們將為您介紹一款強大且安全的開…

用過redis哪些數據類型?Redis String 類型的底層實現是什么?

Redis 數據類型有哪些&#xff1f; 詳細可以查看&#xff1a;數據類型及其應用場景 基本數據類型&#xff1a; String&#xff1a;最常用的一種數據類型&#xff0c;String類型的值可以是字符串、數字或者二進制&#xff0c;但值最大不能超過512MB。一般用于 緩存和計數器 Ha…

大視協作碼垛機:顛覆傳統制造,開啟智能工廠新紀元

在東三省某食品廠的深夜生產線上&#xff0c;碼垛作業正有序進行&#xff0c;卻不見人影——這不是魔法&#xff0c;而是大視協作碼垛機器人帶來的現實變革。在工業4.0浪潮席卷全球的今天&#xff0c;智能制造已成為企業生存與發展的必由之路。智能碼垛環節作為產線的關鍵步驟&…

c# 保姆級分析繼承詳見問題 父類有一個列表對象,子類繼承這個列表對象并對其進行修改后,將子類對象賦值給父類對象,父類對象是否能包含子類新增的內容?

文章目錄 深入解析:父類與子類列表繼承關系的終極指南 一、問題背景:從實際開發困惑說起 二、基礎知識回顧:必備概念理解 2.1 繼承的本質 2.2 引用類型 vs 值類型 2.3 多態的實現方式 三、核心問題分析:列表繼承場景 3.1 基礎代碼示例 3.2 關鍵問題分解 3.3 結論驗證 四、深…

tensorflow-gpu 2.7下的tensorboard與profiler插件版本問題

可行版本&#xff1a; python3.9.23cuda12.0tensorflow-gpu2.7.0tensorboard2.20.0 tensorboard-plugin-profile 2.4.0 問題描述&#xff1a; 1. 安裝tensorboard后運行tensorboard --logdirlogs在網頁中打開&#xff0c;發現profile模塊無法顯示&#xff0c;報錯如下&#x…

數據結構青銅到王者第一話---數據結構基本常識(1)

目錄 一、集合框架 1、什么是集合框架 2、集合框架的重要性 2.1開發中的使用 2.2筆試及面試題 3、背后涉及的數據結構以及算法 3.1什么是數據結構 3.2容器背后對應的數據結構 3.3相關java知識 3.4什么是算法 3.5如何學好數據結構以及算法 二、時間和空間復雜度 1、…

【Verilog】延時和時序檢查

Verilog中延時和時序檢查1. 延時模型1.1 分布延遲1.2 集總延遲1.3 路徑延遲2. specify 語法2.1 指定路徑延時基本路徑延時邊沿敏感路徑延時狀態依賴路徑延時2.2 時序檢查$setup, $hold, $setuphold$recovery, $removal, $recrem$width, $periodnotifier1. 延時模型 真實的邏輯元…

DigitalOcean Gradient AI平臺現已支持OpenAI gpt-oss

OpenAI 的首批開源 GPT 模型&#xff08;200 億和 1200 億參數&#xff09;現已登陸 Gradient AI 平臺。此次發布讓開發者在構建 AI 應用時擁有更高的靈活度和更多選擇&#xff0c;無論是快速原型還是大規模生產級智能體&#xff0c;都能輕松上手。新特性開源 GPT 模型&#xf…

藏在 K8s 幕后的記憶中樞(etcd)

目錄1&#xff09;etcd 基本架構2&#xff09;etcd 的讀寫流程總覽a&#xff09;一個讀流程b&#xff09;一個寫流程3&#xff09;k8s存儲數據過程源碼解讀4&#xff09;watch 機制Informer 機制etcd watch機制etcd的watchableStore源碼解讀5&#xff09; k8s大規模集群時會存在…

騰訊云EdgeOne安全防護:快速上手,全面抵御Web攻擊

為什么需要專業的安全防護&#xff1f; 在當今數字化時代&#xff0c;網站面臨的安全威脅日益增多。據統計&#xff0c;2023年全球Web應用程序攻擊超7千億次&#xff0c;持續快速增長。 其中最常見的包括&#xff1a; DDoS攻擊&#xff1a;通過海量請求使服務器癱瘓Web應用攻…

SpringBoot中的條件注解

文章目錄前言什么是條件注解核心原理常用條件注解詳解1. ConditionalOnClass和ConditionalOnMissingClass2. ConditionalOnBean和ConditionalOnMissingBean3. ConditionalOnProperty應用場景&#xff1a;多數據源配置在SpringBoot自動配置中的核心作用自動配置的工作原理經典自…

LightGBM時序預測詳解:從原理到 PSO 參數優化

前言 在時間序列預測領域&#xff0c;集成學習方法一直占據重要地位。此前我們介紹了基于傳統集成思想的時序預測方法&#xff08;查看前文&#xff09;&#xff0c;而梯度提升樹&#xff08;GBDT&#xff09;作為集成學習的佼佼者&#xff0c;在時序預測中表現尤為突出。本文…

django生成遷移文件,執行生成到數據庫

當報錯時 重新拉取git&#xff0c;重新生成遷移文件&#xff0c;重新執行 1、生成遷移文件 python manage.py makemigrations 子應用2、執行建表、建字段、修改字段 python manage.py migrate 子應用3、當手動已經在數據庫創建字段時&#xff0c; 用 --fake 標記遷移為 “已應用…