Linux 下的網絡編程

1、目的

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

2、問題

  1. 主機與主機之間在物理層面必須互聯互通。
  2. 進程與進程在軟件層面必須互聯互通。
  • IP地址:計算機的軟件地址,用來標識計算機設備。
  • MAC地址:計算機的硬件地址(固定)。
  • 網絡的端口號:標記同一主機上的不同網絡進程。

3、網絡協議

網絡通信標準

OSI七層模型

開放系統互聯模型,是不同設備間網絡通信的通信標準,可概括為“物數網傳會表應”。

  • 應用層:要傳輸的數據信息,如文件傳輸、電子郵件等。
  • 表示層:進行數據加密、解密操作,壓縮、解壓縮。
  • 會話層:建立數據傳輸通道(會話)。
  • 傳輸層:確定傳輸方式(UDP、TCP),涉及端口號。
  • 網絡層:實現數據路由、路徑規劃(路由器、IP),涉及傳輸方式(UDP、TCP)和端口號。
  • 數據鏈路層:將各層數據封裝成幀,實現點對點通信(局域網內通信),進行差錯檢測(交換機、ARP)。
  • 物理層:定義物理設備標準、電器特性,涉及網線、光纖等傳輸介質。

TCP/IP模型

應用模型,有五層和四層兩種劃分方式。

五層劃分
  • 應用層
    • HTTP:超文本傳輸協議。
    • HTTPS:超文本傳輸協議(SSL加密算法)。
    • FTP:文件傳輸協議(TCP)。
    • TFTP:簡單文本傳輸協議(UDP)。
    • MQTT:消息隊列遙測傳輸(物聯網協議)。
    • DNS:域名解析服務(將域名轉換為IP地址)。
  • 傳輸層
    • TCP:傳輸控制協議。
    • UDP:用戶數據報協議。
  • 網絡層
    • IP協議:包括IPv4和IPv6。
  • 數據鏈路層
    • ARP協議:地址解析協議。
  • 物理層
四層劃分
  • 應用層
  • 傳輸層
  • 網絡層
  • 網絡接口層

4、IP協議

基本概念

IP協議位于網絡層。

  • IPv4為32位,如192.168.1.128。
  • IPv6為128位。

IP地址的用戶表示形式為點分十進制,如192.168.1.140;

計算機存儲形式為32位二進制,如11000000 10101000 00000000 01000011。

組成與相關概念

  • IP地址組成:IP地址 = 網絡位 + 主機位。
    • 例如192.168.0.121/24,其中24表示網絡位的位數。
      • 網絡位:標識該IP地址位于哪個網段(局域網)內。
      • 主機位:標識在這個網段(局域網)內的第幾臺主機。
  • 子網掩碼:用于區分IP地址的網絡位和主機位,搭配IP地址使用。
    • 子網掩碼是1的部分對應IP地址的網絡位,是0的部分對應IP地址的主機位。
    • 如255.255.255.0,其二進制形式為11111111.11111111.11111111.00000000。
  • 網段號:IP地址網絡位不變,主機位全為0,則為該IP地址的網段號。
    • 例如,IP地址192.168.1.3,子網掩碼255.255.0.0,其網段號為192.168.0.0,位于192.168.1.0網段內(網段內的IP能直接通信)。
  • 廣播號:IP地址網絡位不變,主機位全為1,則為該IP地址的廣播號。
    • 向廣播號發送信息,所有局域網內IP都能收到此信息。例如,IP地址192.168.1.3,子網掩碼255.255.255.0,其廣播號為192.168.1.255(如feiQ、VNC使用)。
  • 網關地址:如192.168.1.1。

IP地址劃分

類別范圍子網掩碼用途私有IP地址范圍
A類地址1.0.0.0 - 126.255.255.255255.0.0.0管理大規模網絡10.0.0.0 - 10.255.255.255
127.0.0.0回環地址
B類地址128.0.0.0 - 191.255.255.255255.255.0.0管理大中規模網絡172.16.0.0 - 172.31.255.255
C類地址192.0.0.0 - 223.255.255.255255.255.255.0管理中小規模網絡192.168.0.0 - 192.168.255.255
D類地址224.0.0.0 - 239.255.255.255組播和廣播使用
E類地址240.0.0.0 - 255.255.255.254用來進行實驗
  • 公有IP:由電信公司直接分配,需要付費,可以直接訪問internet。
  • 私有IP:不能直接訪問internet的IP地址,目的是節省IP地址。

5、網絡端口號

基本信息

????????端口號是16位的整形數據(unsigned short),范圍為0~65535,功能是標記同一主機的不同網絡進程。

分類

  1. 1-1023之間的端口號:任何TCP/IP實現所提供的服務使用。如http:80,FTP:20/21,TFPT:69,HTTPS:443。
  2. 1024-49151:被注冊的端口號,被IANA指定為特殊服務使用。如MQTT:1883/8883。
  3. 49152-65535:動態或私有端口號。

6、網絡配置

  1. ping命令:ping ip地址/域名,用于查看當前主機和IP/域名所對應的主機網絡是否聯通。如ping www.baidu.com。
  2. 查看IP地址
    • 在Linux中使用????????ifconfig。
    • 在Windows上使用? ? ? ipconfig。
  3. 網絡配置步驟
    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)即傳輸層用戶數據報協議。

網絡編程模型

  • B/S模型(browser/server,瀏覽器/服務器):
    1. 客戶端是通用的客戶端(瀏覽器)。
    2. 一般只做服務器開發。
    3. 客戶端要加載的數據均來自服務器。
  • C/S模型(client/server,客戶端/服務端):
    1. 客戶端是一個專用的客戶端。
    2. 服務器和客戶端都需開發。
    3. 客戶端可以保存資源,本地加載,無需所有數據都請求服務器。

UDP編程

套接字

套接字是文件描述符,是網絡通信時應用層可操作的端口。

相關函數
  1. 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。
  2. sendto函數

    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。
  3. sockaddr_in結構體(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 */  
    };  
    
  4. 字節序轉換函數? ??

字節序轉換

網絡字節序(大端順序)和主機字節序(小端順序)在數據存儲方式上存在差異。

網絡字節序中,高位字節存儲在低地址;主機字節序中,低位字節存儲在低地址。

例如,數值$0x1234$:

  • 小端存儲:低地址為$0x34$,高地址為$0x12$
  • 大端存儲:低地址為$0x12$,高地址為$0x34$

標準庫函數提供了字節序轉換功能,具體聲明如下:

uint32_t htonl(uint32_t hostlong);          // 主機轉網絡(32位)
uint16_t htons(uint16_t hostshort);         // 主機轉網絡(16位)
uint32_t ntohl(uint32_t netlong);           // 網絡轉主機(32位)
uint16_t ntohs(uint16_t netshort);          // 網絡轉主機(16位)
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

8、代碼訓練

#include<stdio.h>
#include<unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h> 
#include <arpa/inet.h>
#include<string.h>
#include <stdlib.h>int main(int argc, char const *argv[])
{int sockfd = socket(AF_INET, SOCK_DGRAM, 0);if(sockfd < 0){perror("socket error");return -1;}// struct sockaddr_in seraddr;seraddr.sin_family = AF_INET;seraddr.sin_port = htons(50000);seraddr.sin_addr.s_addr = inet_addr("192.168.0.179");// 創建子進程char buff[1024] = {0};while(1){fgets(buff, sizeof(buff), stdin);ssize_t cnt = sendto(sockfd, buff, strlen(buff), 0, (struct sockaddr *)&seraddr, sizeof(seraddr));if(cnt < 0){perror("sendto error");return -1;}printf("cnt = %ld\n", cnt);memset(buff, 0, sizeof(buff));}close(sockfd);return 0;
}
#include<stdio.h>
#include<unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h> /* superset of previous */
#include <arpa/inet.h>
#include <stdlib.h>int main(int argc, char const *argv[])
{int sockfd = socket(AF_INET, SOCK_DGRAM, 0);if(sockfd < 0){perror("socket error");return -1;}// 服務端自己的地址信息變量struct sockaddr_in seraddr;seraddr.sin_family = AF_INET;seraddr.sin_port = htons(50000);seraddr.sin_addr.s_addr = inet_addr("192.168.0.177");int ret = bind(sockfd, (struct sockaddr *)&seraddr, sizeof(seraddr));if(ret < 0){perror("bind error");ret -1;}char buff[1024] = {0};while(1){ssize_t cnt = recvfrom(sockfd, buff, sizeof(buff), 0, NULL, NULL);if(cnt < 0){perror("recvfrom error");return -1;}printf("cnt = %ld, buff = %s\n", cnt, buff);memset(buff, 0, sizeof(buff));}close(sockfd);return 0;
}

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

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

相關文章

Go語言在邊緣計算中的網絡編程實踐:從入門到精通

一、引言 在數字化浪潮席卷全球的今天&#xff0c;邊緣計算如同一股清流&#xff0c;正在重新定義我們對網絡架構的理解。想象一下&#xff0c;當你在自動駕駛汽車中需要毫秒級響應&#xff0c;或者在偏遠工廠中需要實時處理傳感器數據時&#xff0c;傳統的云計算模式就像是&qu…

ASPICE過程能力確定——度量框架

&#x1f697;【汽車人必看】ASPICE能力評估核心&#xff1a;度量框架全解析&#xff5c;90%工程師都搞不懂的評分規則&#xff01;&#x1f50d; 為什么你的ASPICE評估總卡在L2&#xff1f;——揭秘6大能力等級背后的評分邏輯&#xff0c;附提升秘籍&#xff01;&#x1f525;…

機器學習在量化中的應用

一、核心應用場景在因子研究中&#xff0c;scikit-learn 主要解決以下幾類問題&#xff1a;因子預處理與標準化&#xff1a;StandardScaler, RobustScaler因子有效性分析&#xff1a;LinearRegression (IC分析)降維與因子合成&#xff1a;PCA, FactorAnalysis機器學習預測模型&…

RabbitMQ:消息轉化器

目錄一、基本概述二、如何處理一、基本概述 在RabbitMQ中&#xff0c;一般情況下傳遞字符串會被正常解析&#xff0c;如果傳遞的是一個Object類型或者是一個對象類型的時候&#xff0c;RabbitMQ會將其自動轉化為字節碼發送&#xff0c;這不利于我們的讀取個解析。 二、如何處…

【Protues仿真】基于AT89C52單片機的LCD液晶顯示屏顯示控制

目錄 1 LM016L液晶顯示模塊 1.1 基本參數 1.2 引腳定義 1.3硬件連接示例&#xff08;AT89C52&#xff09; 1.4 常用指令集&#xff08;HD44780 子集&#xff09; 1.5 常見問題與注意事項 1.8 結論 2 LM016L液晶顯示模塊控制電路原理圖 3 LM016L液晶顯示模塊控制程序 …

孤獨傷感視頻素材哪里找?分享熱門傷感短視頻素材資源網站

你是不是也經常在抖音上刷到很火的傷感視頻&#xff0c;那么傷感視頻素材都在哪里可以下載呢&#xff1f;作為一名從業多年的視頻剪輯師&#xff0c;今天就跟大家聊聊那些可以下載傷感素材高清無水印的網站&#xff0c;如果你也在苦苦找尋傷感素材&#xff0c;快來看看吧&#…

筆記本怎么才能更快散熱?

一、“物理降溫法”??? 墊高高&#xff01;別讓底部 “窒息”?筆記本底部全是進風口&#xff0c;放床上 / 沙發上會被堵住&#xff01;墊點東西拉開底部空間&#xff0c;高度 1-2cm。??? 給風扇 “松綁”?按「CtrlShiftEsc」打開任務管理器&#xff0c;點 “進程”&…

電機驅動實現插補算法之脈沖和方向接收(以stm32主控為例)

一、方案 A&#xff08;推薦&#xff09;&#xff1a;編碼器模式吃脈沖&#xff08;TI1 STEP&#xff0c;TI2 DIR&#xff09; 核心思路 把定時器設為 Encoder TI1 模式&#xff1a;每個 STEP 上升沿計一次&#xff0c;在那個沿的瞬間用 TI2&#xff08;DIR&#xff09;的電…

[特殊字符] 潛入深淵:探索 Linux 內核源碼的奇幻之旅與生存指南

文章目錄 朋友們&#xff0c;敲黑板&#xff01;&#xff01;&#xff01;&#xff08;超級重要&#xff09;我們今天聊點硬核的——不是普通的代碼&#xff0c;而是驅動了整個數字世界心跳的Linux內核源代碼&#xff01;它藏在哪&#xff1f;就在那個傳奇倉庫&#xff1a;torv…

如何監控和管理微服務之間的調用關系

監控和管理微服務之間的調用關系需要結合分布式追蹤、服務依賴分析、實時監控和可視化工具&#xff0c;以實現對調用鏈路的可見性、問題定位和性能優化。以下是具體的實現方案和工具鏈&#xff1a;一、核心監控目標調用鏈路可視化&#xff1a;展示服務間的調用關系、方向和頻率…

3.4 縮略詞抽取

概述 縮略詞指的是一個詞或者短語的縮略形式&#xff0c;其通常由原詞中的一些組成部分構成&#xff0c;同時保持原詞的含義。縮略詞的檢測與抽取在方法上與同義詞的檢測與抽取類似&#xff0c;但是相比同義詞&#xff0c;縮略詞在文本中出現的規則往往更簡單。 不同語言縮略詞…

Lua腳本如何執行主程序的C函數

Lua Call C function Lua腳本可以和C函數靈活的結合&#xff0c;Lua腳本作為控制語言&#xff0c;使用C函數來做性能計算部分。 Lua腳本的執行器有Lua 和 Luajit。 使用Lua執行器&#xff0c;可以通過C語言注冊C函數到Lua State, 然后Lua腳本可以調用該C函數。 使用Luajit&…

農業-學習記錄

1-git上傳&#xff08;簡易版&#xff09;首先&#xff0c;記得vscode打開的項目路徑是/home/Agribrain。不然會提示上傳很多項目無關的文件。① 暫存所有更改②使用vscode終端注意&#xff1a;終端打開路徑&#xff1a;/home/Agribrain/agribrain【git項目的所在目錄】&#x…

什么是數據集成?數據集成對數據治理有什么影響

在大數據與人工智能驅動的時代&#xff0c;數據已經成為企業的“新型生產力”。然而&#xff0c;企業內部數據往往分散在不同系統、不同格式、甚至不同地域中。如果缺乏有效管理與整合&#xff0c;數據價值就無法真正釋放。這時&#xff0c;“數據集成”應運而生&#xff0c;它…

技術成長戰略是什么?

文章目錄技術成長戰略是什么&#xff1f;1. 前言2. 跟技術大牛學成長戰略2.1 系統性能專家案例2.2 從開源到企業案例2.3 技術媒體大V案例2.4 案例小結3. 學習金字塔和刻意訓練4. 戰略思維的誕生5. 建議技術成長戰略是什么&#xff1f; 1. 前言 在波波的微信技術交流群里頭&am…

從0到1打造一臺機器人走起來

聚焦仿人雙足機器人,著重解決其下肢魯棒行走中仿真到實機間隔(SimToReal gap)的誤差問題 總述 硬件:采用傅利葉智能科技一體化關節模組: 1)胯部和膝關節選用 FSA80 - 29E 電機,以承受較大扭矩; 2)大腿部分采用 FSA60 - 43E 電機,兼顧扭矩和轉速需求; 3)小腿選用 …

【Cmake】Cmake概覽

目錄 一.環境準備 1.1.Cmake安裝 1.2. VSCodeCMake插件安裝 1.3 快速樣例-helloworld?程 二. cmake的基礎命令?使用示例 2.1.文件準備 2.2.?成構建系統 2.3.編譯連接 2.4.測試Ctest模塊 2.5.測試安裝模塊 2.6.測試打包模塊 2.7 查看幫助 CMake語法簡潔清晰&…

概率核心概念學習筆記:隨機事件與樣本空間、古典概率與條件概率、全概率公式與貝葉斯公式

目錄 一、 隨機事件與樣本空間 1. 原理講解 2. 類型與關系 3. 案例計算 4. 應用場景 二、 古典概率與條件概率 1. 古典概率 (Classical Probability) 2. 條件概率 (Conditional Probability) 三、 全概率公式與貝葉斯公式 1. 全概率公式 (Law of Total Probability) …

優考試局域網系統V6.0.0版

優考試局域網系統迎來V6.0.0版本更新&#xff0c;核心在于提升功能性能與優化操作體驗。重點對學情分析、移動端考試支持、考試監控和答題體驗等方面進行了實用性更新&#xff0c;進一步提升了局域網環境下考試系統的靈活性與管理效率。 一、增加學情分析功能&#xff0c;教學…

Autosar之Com模塊

Com模塊主要實現了Signal在I-PDU中的封裝及解析功能,為RTE層提供了基于Signal的發送與接收接口,實現了基于Signal的網關功能,實現了PDU的不同發送模式,以及Signal濾波,Update bit,Pdu Counter等功能 圖 Com模塊層次圖 Com模塊處于AUTOSAR架構中的通信服務層,其下層模塊…