《Linux 網絡編程一:網絡編程導論及UDP 服務器的創建與數據接收》

Linux下的網絡編程

1. 目的

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

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

網絡通信標準。

  • OSI七層模型(理論模型):開放系統互連模型,是不同體系結構設備間網絡通信的通信標準。
    • 應用層:要傳輸的數據,如文件傳輸、電子郵件。
    • 表示層:數據加密解密操作、壓縮解壓縮操作。
    • 會話層:建立數據傳輸通道。
    • 傳輸層:傳輸的方式,如UDP、TCP、端口號。
    • 網絡層:實現數據路由,如路由器、IP。
    • 數據鏈路層:封裝成幀、點對點通信(局域網內通信)、差錯檢測,如交換機。
    • 物理層:定義物理設備標準、電氣特性,如網線、光纖等傳輸介質,比特流(bit 0/1)。
  • TCP/IP模型(應用模型):
    • 五層:
      • 應用層:
        • HTTP:超文本(數據類型較多)傳輸協議。
        • HTTPS:超文本傳輸協議(SSL加密算法)。
        • FTP:文件傳輸協議(TCP傳輸)。
        • TFTP:簡單文件傳輸協議(UDP傳輸)。
        • MQTT:消息隊列遙測傳輸協議(廣泛應用于物聯網協議傳輸)。
        • DNS:域名解析服務(將一個域名轉換為IP地址)。
      • 傳輸層:
        • TCP:傳輸控制協議(構建路徑)。
        • UDP:用戶數據報協議(傳輸時不構建路徑,找效率高的,可能導致亂序;不安全,可能會導致丟包)。
      • 網絡層:
        • IP協議:
          • IPv4。
          • IPv6。
      • 數據鏈路層:
        • ARP:地址解析協議(IP地址和MAC地址之間的轉換)。
      • 物理層。
    • 四層:
      • 應用層。
      • 傳輸層。
      • 網絡層。
      • 網絡接口層。
4. IP協議

網絡層協議。

  • IPv4:32位(用ipconfig在Windows終端上查看)。
  • IPv6:128位。
  • IP地址 = 網絡位 + 主機位,和子網掩碼搭配使用,子網掩碼全為1的是網絡位,全為0的是主機位。
    • 示例:192.168.0.121/24(24表示網絡位的位數)。
    • 網絡位:標識該IP地址所在的網段(局域網)。
    • 主機位:標識該網段中的具體主機。
    • 網段號:如192.168.1.0(網絡位保留,主機位為0)。
    • 廣播號:如192.168.1.255(網絡位不變,主機位全為1)。
    • 網關地址:如192.168.1.1(網絡位保留,主機位為1)。
  • IP地址劃分:
    1. A類地址:
      • 范圍:1.0.0.0 - 126.255.255.255。
      • 子網掩碼:255.0.0.0。
      • 主機數量: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。
  • 這樣可以節省IP地址。
5. 網絡端口號

端口號:16位的整型數據(unsigned short),范圍0 - 65535。
端口號功能:標記同一主機上的不同網絡進程。
分類:

  1. 任何TCP/IP實現所提供的服務都用1 - 1023之間的端口號。
    • HTTP:80。
    • FTP:20/21。
    • TFTP:69。
    • HTTPS:443。
    • MQTT:1883/8883。
  2. 端口號從1024 - 49151是被注冊的端口號,被IANA指定為特殊(如MQTT:1883/8883)。
  3. 從49152 - 65535是動態或私有端口號。
  4. 數據包封裝與解封過程
6. 網絡配置
  1. ping ip地址/域名:查看當前主機和IP/域名所對應的網絡是否聯通,例如ping www.baidu.com
  2. ifconfig
    • Linux上查看IP地址。
    • Windows上使用ipconfig
  3. 網絡配置步驟:
    1. 虛擬機->設置->網絡適配器->橋接模式。
    2. 編輯->虛擬網絡編輯器->更改設置->VMnet0->橋接至->當前上網的網卡->應用。
    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

在傳輸層(用戶數據報協議User Datagram Protocol)。

  1. 網絡編程模型:
    • B/S模型:browser(瀏覽器)/server(服務器)。
      • 客戶端是一個通用的客戶端(瀏覽器)。
      • 一般只做服務器開發。
      • 客戶端要加載的數據均來自服務器。
    • C/S模型:client(客戶端)/server(服務端)。
      • 客戶端是一個專用的客戶端。
      • 服務器和客戶端都需開發。
      • 客戶端保存資源,本地加載,無需所有數據都請求服務器。
  2. 編程:
    • 客戶端:
      • socket():創建通信的套接字(文件描述符,網絡通信時應用層可操作的端口)。
      • sendto():發送數據。
      • recvfrom():接受數據。
      • close():關閉套接字。
    • 服務端:
      • socket():創建通信的套接字。
      • bind():綁定服務器的IP和端口。
      • sendto():發送數據。
      • recvfrom():接受數據。
      • close():關閉套接字。
  3. 相關函數:
    • 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。
    • 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:接收方地址的大小。
      • 返回值:成功返回實際發送的字節數。

? ? ? ? 3.

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

? ? ? ? 4.

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

? ? ? ? 5.

網絡字節序:大端                network
主機字節序:小端  50000   host
????????8.代碼

? ? ? ? ? ? ? ? UDP相關編程

客戶端

#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <unistd.h>
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>int main(int argc, char const *argv[])
{int sockfd = socket(AF_INET, SOCK_DGRAM, 0);//man 7 ip/創建套接字(網絡類型;UDP;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");//ip地址// while(1)// {//     ssize_t cnt = sendto(sockfd, "1111", 13, 0, (struct sockaddr *)&seraddr, sizeof(seraddr));//發送// }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);}close(sockfd);//關閉return 0;
}

服務端

#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <unistd.h>
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.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.192");int ret = bind(sockfd, (struct sockaddr *)&seraddr, sizeof(seraddr));if(ret < 0){perror("bind error");return -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/news/919794.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/919794.shtml
英文地址,請注明出處:http://en.pswp.cn/news/919794.shtml

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

相關文章

排序(數據結構)

比較排序 插入排序&#xff08;斗地主摸牌就是一個插入排序&#xff09; 單純的插入排序也叫直接插入排序 時間復雜度&#xff1a; 最好O(n)最壞O(n^2) 過程 先寫單趟&#xff0c;再寫整體 依次比較&#xff0c;如果大于就往后挪動&#xff0c;否則就退出循環&#xff0c;插入數…

【C++組件】Elasticsearch 安裝及使用

&#x1f308; 個人主頁&#xff1a;Zfox_ &#x1f525; 系列專欄&#xff1a;C框架/庫 目錄&#x1f525; 介紹 &#x1f525; ES 安裝 &#x1f98b; 安裝 kibana&#x1f98b; ES 客戶端的安裝&#x1f525; ES 核心概念 &#x1f98b; 索引&#xff08;Index&#xff09;&…

項目:電動車報警器

1.項目需求 點擊遙控器A按鍵&#xff0c;系統進入警戒模式&#xff0c;一旦檢測到震動(小偷偷車)&#xff0c;則喇叭發出聲響報警&#xff0c;嚇退小偷。 點擊遙控器B按鍵&#xff0c;系統退出警戒模式&#xff0c;再怎么搖晃系統都不會報警&#xff0c;否則系統一直發出尖叫&a…

GDSFactory環境配置(PyCharm+Git+KLayout)

1、安裝 PyCharm 和 KLayout 安裝 PyCharm&#xff08;官網社區版即可&#xff09;和 KLayout&#xff08;官網最新版&#xff09;&#xff0c;這兩款軟件均開源&#xff0c;安裝操作簡單&#xff0c;這里不再贅述。&#xff08;注意&#xff1a;PyCharm軟件是否安裝成功以能否…

STM32 定時器(輸出模式)

?? ?一、輸出模式總覽?STM32定時器的輸出比較模式通過比較計數器&#xff08;CNT&#xff09;與捕獲/比較寄存器&#xff08;CCRx&#xff09;的值&#xff0c;控制輸出引腳&#xff08;OCx&#xff09;的電平狀態。六種模式定義如下&#xff1a;?模式宏??觸發動作?&am…

嵌入式硬件篇---手柄

手柄原理&#xff1a;手柄遙控的原理其實可以簡單理解為 “信號的發送與接收”&#xff0c;就像兩個人用對講機聊天&#xff0c;一方說話&#xff08;發送信號&#xff09;&#xff0c;另一方聽話&#xff08;接收信號&#xff09;&#xff0c;然后根據內容行動。下面用通俗的方…

數據庫架構開發知識庫體系

摘要面向初創與企業團隊&#xff0c;系統梳理數據庫與數據平臺從采集、傳輸、存儲、處理、服務化到治理與安全的全鏈路。覆蓋 OLTP/OLAP/HTAP、湖倉一體與實時數據棧&#xff0c;結合國內外工具與方法論&#xff0c;給出架構選型、性能優化、可靠性與合規要點&#xff0c;以及可…

在Excel和WPS表格中合并多個單元格這樣最快

如果要把WPS表格和Excel中多個單元格的數據合成到一個單元格中&#xff0c;不用函數&#xff0c;只需要先寫輸入公式&#xff0c;然后在各個單元格之間輸入&符號即可。&#xff08;當然&#xff0c;&符號不只是連接單元格的數據&#xff0c;也可以直接輸入內容連接&…

在嵌入式上用 C++14實現簡單HSM狀態機

文章目錄概述為什么要遷移到 C&#xff0c;以及 C 的陷阱目標與挑戰為什么不能直接使用 std::function&#xff1f;解決方案&#xff1a;POD 回調與模板 Trampoline核心設計模板 trampoline 實現兩種成員函數綁定策略1. **Per-Transition Context&#xff08;每個狀態轉移綁定一…

【unity】Obfuz加固混淆日志還原解析方案ObfuzResolver

Github | Gitee ObfuzResolver是基于obfuz-tools針對Obfuz的一項輔助工具&#xff0c;方便開發者在unity編輯器中或者運行時快捷將使用Obfuz混淆加固后的日志信息還原為原始信息&#xff0c;以輔助開發者快速定位Bug。 特性 支持unity編輯器模式下還原被加固混淆的日志信息&a…

2025DevOps平臺趨勢解讀:哪些DevOps工具正在引領行業變革?

DevOps平臺已成為企業提升研發效能、實現敏捷交付的核心支柱。2025年DevOps領域正經歷深刻變革&#xff0c;平臺能力正從“工具鏈整合”向“價值流智能中樞”躍升。01. 2025Devops平臺趨勢解讀“全棧式”與“模塊化/可組合”的平衡&#xff1a;企業既需要能覆蓋開發、測試、部署…

第二階段Winform-4:MDI窗口,布局控件,分頁

1_MDI窗口 &#xff08;1&#xff09;MDI是指將多控件窗體在同一窗體中打開,可以設置重疊打開&#xff0c;平捕打開等&#xff0c;MDI窗體&#xff08;Multiple-Document Interface&#xff0c;多文檔界面&#xff09;用于同時顯示多個文檔。在項目中使用MDI窗體時&#xff0c…

實用R語言機器學習指南:從數據預處理到模型實戰(附配套學習資源)

一、為什么需要掌握機器學習建模&#xff1f;在科研與項目實踐中&#xff0c;機器學習已成為數據挖掘的核心工具。本文手把手帶你在R語言中實現7大常用模型&#xff1a;邏輯回歸/正則化回歸決策樹/隨機森林SVM支持向量機XGBoost梯度提升神經網絡全程包含數據標準化→模型訓練→…

go.uber.org/zap 日志庫高性能寫入

使用 go.uber.org/zap 實現日志分割功能 實現按照單個文件最大MB自動分割,最多保留多少天的文件,是否啟用壓縮,按天自動分割日志 核心依賴 go.uber.org/zap:核心日志庫 lumberjack.v2:日志輪轉工具(實現按大小/時間分割) 時間處理依賴標準庫 time 實現步驟 1. 初始化…

電腦端完全免費的動態壁紙和屏保軟件(真正免費、無廣告、無會員)

? 1. Lively Wallpaper&#xff08;強烈推薦&#xff09; 特點&#xff1a;完全免費、開源、無廣告&#xff0c;支持本地視頻/GIF/網頁作為動態壁紙內置資源&#xff1a;12個高質量動態壁紙&#xff08;可自定義&#xff09;屏保功能&#xff1a;支持將動態壁紙一鍵設為屏保系…

C#_組合優于繼承的實際應用

2.2 Composition over Inheritance&#xff1a;組合優于繼承的實際應用 繼承&#xff08;Inheritance&#xff09;是面向對象編程中最容易被過度使用和誤用的特性之一。傳統的教學往往讓人們優先選擇繼承來實現代碼復用和建立“是一個&#xff08;is-a&#xff09;”的關系。然…

Kafka消息丟失的場景有哪些

生產者在生產過程中的消息丟失 broker在故障后的消息丟失 消費者在消費過程中的消息丟失ACK機制 ack有3個可選值&#xff0c;分別是1&#xff0c;0&#xff0c;-1。 ack0&#xff1a;生產者在生產過程中的消息丟失 簡單來說就是&#xff0c;producer發送一次就不再發送了&#…

盼之代售 231滑塊 csessionid 分析

聲明 本文章中所有內容僅供學習交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包內容、敏感網址、數據接口等均已做脫敏處理&#xff0c;嚴禁用于商業用途和非法用途&#xff0c;否則由此產生的一切后果均與作者無關&#xff01; 逆向分析 部分python代碼 url "…

STL關聯式容器解析:map與set詳解

目錄 1. 關聯式容器 2. 鍵值對 3. 樹形結構的關聯式容器 3.1 set 3.1.2 set的使用 3.2 map 3.2.1 map的介紹 3.2.2 map的使用 3.3 multiset 3.3.1 multiset的介紹 3.3.2 multiset的使用 3.4 multimap 3.4.1 multimap的介紹 3.4.2 multimap的使用 4.紅黑樹模擬實現…

貪吃蛇--C++實戰項目(零基礎)

視頻地址&#xff1a;C語言必學項目&#xff1a;貪吃蛇&#xff01; 貪吃蛇游戲框架 ├── 基礎框架 │ ├── 頭文件引入 │ ├── 常量和宏定義 │ └── 窗口初始化 │ ├── 數據結構系統 │ ├── Pos結構體(位置和顏色) │ ├── Snake結構體(蛇的屬性) │ ├──…