嵌入式第三十五課!!Linux下的網絡編程

一、目的

? ? ? ? 網絡編程的目的實際上也是進程通信的一種方式,不過它可以在不同的主機上進行通信;

二、需要解決的問題

? 1. 主機與主機之間物理層面必須互聯互通。

  • 指的是參與通信的計算機(主機)需要通過物理設備建立連接(光纖、網線),確保數據能夠在物理介質上傳輸
  • 具體包括:網卡正常工作、網線或無線信號等傳輸介質連接正常、路由器 / 交換機等網絡設備配置正確

? 2. 進程與進程在軟件層面必須互聯互通。

  • 指的是在物理連接通暢的基礎上,不同主機上的應用程序進程需要通過網絡協議進行邏輯連接
  • 具體包括:使用正確的 IP 地址和端口號、采用相同的網絡協議(如 TCP/UDP)、進程已正確綁定端口并處于監聽狀態

舉個例子:

這是一個傳輸機制圖解;每個有IP地址的方格代表一個主機;其中,交換機就是局域網內的主機通信的物理設備;但是如果要在廣域網與其他網段的主機進行通信的話,就需要“路由器+ 鏈路” 來負責跨網段轉發。簡單說,左邊局域網和右邊局域網,靠路由器之間的物理鏈路打通,數據就能從左傳到右、右傳到左。

至于進程,兩邊進程得用?相同的協議(比如 TCP/UDP)?說話。比如左邊進程用 TCP 發數據,右邊進程也得用 TCP 收,否則 “語言不通” 沒法交流。而每個進程要通信,得綁定?IP + 端口。比如左邊主機?192.168.0.140?上的QQ給另一臺主機的QQ發消息,得告訴系統:“我在?192.168.0.140?這臺機器,監聽?QQ?端口,別人可以給我發數據”;右邊主機?192.168.1.140?上的進程同理。如果端口不同,就有可能接收不到信息;

所以,在這里總結幾個概念:

  • IP地址:計算機的軟件地址,用來標識計算機設備(由路由器動態分配)
  • MAC地址:計算機的硬件地址(固定)
  • 網絡的端口號:標記同一主機上的不同網絡進程

需要注意的是:

  • 在同一個局域網下,不能有2個一模一樣的ip地址;
  • 路由器在進行遠距離數據傳輸的時候,會對路徑進行選擇規劃,力求最短/最快路徑

圖解如下:

三、網絡協議

網絡協議即是不同體系結構設備間,網絡通信的標準

OSI七層模型

意味開放系統互聯模型(open system interconnect)

它是一個理論模型:

應用層要傳輸的數據信息,如文件傳輸,電子郵件等
表示層數據加密,解密操作,壓縮,解壓縮(安全性)
會話層建立數據傳輸通道,? (會話)
傳輸層傳輸的方式 ?UDP ?TCP ? 端口號
網絡層實現數據路由,路徑規劃 ? ?路由器 ?ip
數據鏈路層封裝成幀(幀數據),點對點通信(局域網內通信),差錯檢測 ? 交換機 ?ARP
物理層

定義物理設備標準、電氣特性,比如網線,光纖等傳輸介質(比特流 ?bit ?0 1)

TCP/IP模型:應用模型

它是一個應用模型,一共分為5層:

應用層
?HTTP超文本傳輸協議
HTTPS超文本傳輸協議(SSL加密算法)
FTP文件傳輸協議(TCP)
TFTP簡單文件傳輸協議(UDP)
MQTT消息隊列遙測傳輸(物聯網協議)
DNS域名解析服務(www.baidu.com轉為IP地址)
傳輸層
TCP傳輸控制協議
UDP用戶數據報協議
網絡層
IP協議IPV4IPV6
數據鏈路層
ARP地址解析協議

? ? ? ? ? ? ? ? 物理層同上:

物理層

定義物理設備標準、電氣特性,比如網線,光纖等傳輸介質(比特流 ?bit ?0 1)

在有一些定義中,也可能是四層:

  • 應用層:同上
  • 傳輸層:同上
  • 網絡層:同上
  • 網絡接口層:包含物理層與數據鏈路層

四、IP協議

網絡層

IPv432位
IPv6128位

例:

192.168.1.140 ?? ??? ?(用戶表示形式) ? 點分十進制 ??
11000000 10101000 00000000 01000011?? ?(計算機存儲形式) 32bits

IP地址

IP地址 = 網絡位 + 主機位?

例:192.168.0.121/24
24:網絡位的位數

網絡位該IP地址位于哪個網段(局域網)內
主機位這個網段(局域網)第幾臺主機
子網掩碼用來區分IP地址的網絡位和主機位,搭配IP地址使用。

舉個例子:

255.255.255.0
11111111.11111111.11111111.00000000
子網掩碼是1的部分對應IP地址的網絡位
子網掩碼是0的部分對應IP地址的主機位

特殊的IP地址

網段號:IP地址網絡位不變,主機位全為0,則為該IP地址的網段號
廣播號:IP地址網絡位不變,主機位全為1,則為該IP地址的廣播號
網關地址:192.168.1.1(局域網與廣域網的網關)

舉個例子:

IP地址:192.168.1.3

子網掩碼:255.255.255.0

網段號:192.168.1.0(網段內的IP能直接通信)

IP地址:192.168.1.3

子網掩碼:255.255.255.0

網段號:192.168.1.255(向廣播號發送信息,所有局域網內IP都能收到此信息)

IP地址的劃分

在此之前,我們先來區分兩個概念:

為了節省ip地址,把ip分為兩種:

公有IP:由電信公司直接分配,并需要付費的IP地址, 可以直接訪問internet
私有IP:不能直接訪問internet的ip地址,由路由器分配,進入廣域網時自動轉為公有IP

(1)A類地址:

用于管理大規模網絡

范圍1.0.0.0 - 126.255.255.255
子網掩碼255.0.0.0
可以分配的IP地址數126*2^24
私有IP地址10.0.0.0 - 10.255.255.255

(2)B類地址:

管理大中規模網絡

范圍128.0.0.0 - 191.255.255.255
子網掩碼255.255.0.0
可以分配的IP地址數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
可以分配的IP地址數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

五、 網絡端口號

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

分類

1)任何TCP/IP實現所提供的服務都用1-1023之間的端口號。

http??80
FTP?20/21
TFPT69
HTTPS443

2)端口號從1024-49151是被注冊的端口號,被IANA指定為特殊服務使用。

MQTT:1883/8883

3)從49152-65535是動態或私有端口號。

六、網絡配置

1. ?ping ?ip地址/域名

????????????????查看當前主機和IP/域名所對應的這臺主機網絡是否聯通

2. ifconfig?

????????????????在Linux查看當前主機的IP地址

????????ipconfig

????????????????在Windows上查看當前主機的IP地址

?3. 網絡配置

?1)虛擬機--》設置--》網絡適配器---》橋接模式

?2)編輯--》虛擬網絡編輯器--》更改設置--》VMnet0---》橋接至--》當前PC正在上網的網卡上--》應用--》確定

3)修改網絡配置文件

?????????????????在終端輸入命令:sudo vim /etc/network/interfaces

auto lo
iface lo inet loopbackauto ens33 
iface ens33 inet dhcp

?4)重啟網絡服務

????????????????sudo /etc/init.d/networking restart

?5) 測試

????????????????ping www.baidu.com

七、網絡協議——UDP

UDP:(傳輸層)用戶數據報協議(User Datagram Protocol)

? 1)網絡編程模型

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

?2)UDP編程流程

我們先來厘清一個概念:

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

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:接收方地址的大小
返回值:
成功:實際發送的字節數
失敗:-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 */};

其中:

port in network byte order代表基于網絡字節序的端口號;

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

為了切換這兩者,我們可以使用函數:

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

我們通常傳遞的ip地址為一個字符串,為了使其切換成二進制IP地址的形式,也要再調用一次函數:

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

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

bind函數:

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

recvfrom函數:

功能:從套接字上接收數據
參數:
sockfd:套接字
buf:存放接收數據的內存首地址
len:希望接收的字節數
flags:0 :按照默認方式接收(阻塞)
src_addr:發送方的地址信息
addrlen:發送發地址的指針
功能:
成功:實際接收到的字節數
失敗:-1

客戶端編程:

#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h> /* superset of previous */
#include <sys/types.h>          /* See NOTES */
#include <arpa/inet.h>
#include <unistd.h>int main(int argc, const char *argv[])
{//socket()//sendto()//recvfrom()//close()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");  //接收方所在主機的IP地址char buff[1024] = {0};while (1){fgets(buff, sizeof(buff), stdin);ssize_t cnt = sendto(sockfd, buff, 0, 0, (struct sockaddr *)&seraddr, sizeof(seraddr));if (cnt < 0){perror("sendto error");return -1;}//	printf("cnt = %ld\n", cnt);memset(buff, 0, sizeof(buff));recvfrom(sockfd, buff, sizeof(buff), 0, NULL, NULL);printf("ser-->cli : %s\n", buff);}//close(sockfd);return 0;
}

服務端編程:

#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h> /* superset of previous */
#include <sys/types.h>          /* See NOTES */
#include <arpa/inet.h>
#include <unistd.h>int main(int argc, const char *argv[])
{//socket()//bind()//recvfrom()//sendto()//close()int sockfd = socket(AF_INET, SOCK_DGRAM, 0);if (sockfd < 0){perror("socket error");return -1;}struct sockaddr_in cliaddr;socklen_t clilen = sizeof(cliaddr);//服務端自己的地址信息變量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");int ret = bind(sockfd, (struct sockaddr *)&seraddr, sizeof(seraddr));if (ret < 0){perror("bind error");return -1;}char buff[1024] = {0};while (1){memset(buff, 0, sizeof(buff));ssize_t cnt = recvfrom(sockfd, buff, sizeof(buff), 0, (struct sockaddr *)&cliaddr, &clilen);if (cnt < 0){perror("recvfrom error");return -1;}else if (0 == cnt){printf("cnt = %ld\n", cnt);break;}printf("[%s : %d][%ld] %s\n", inet_ntoa(cliaddr.sin_addr), ntohs(cliaddr.sin_port),cnt, buff);fgets(buff, sizeof(buff), stdin);//strcat(buff, "--->ok");sendto(sockfd, buff, strlen(buff), 0, (struct sockaddr *)&cliaddr, clilen);}close(sockfd);return 0;
}

以上就是今天和大家分享的內容!!!!感謝你的閱讀!!!!!

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

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

相關文章

遙感機器學習入門實戰教程|Sklearn案例⑦:特征選擇與重要性分析

很多同學問&#xff1a;波段/特征一多就“維度災難”&#xff0c;訓練慢、過擬合&#xff0c;且很難解釋“哪些特征最關鍵”。本篇用 sklearn 給出一套能跑、可視化、可比較的最小工作流&#xff0c;并配上方法論速記&#xff0c;幫助你在高光譜/多特征任務里做出穩健篩選。 &a…

地理數據制備:蔚藍地圖空氣質量數據的獲取、清洗與坐標匹配指南

【&#x1f4ca;】手把手攻略&#xff1a;如何從“蔚藍地圖”挖寶——獲取濟南市可用空氣質量數據全記錄 一份不需要寫代碼也能搞定環境數據獲取的實用指南 ? 引言&#xff1a;為什么選擇蔚藍地圖&#xff1f; 作為一名環境數據愛好者&#xff0c;我經常需要獲取準確、可靠、…

Unreal Engine USceneComponent

Unreal&#x1f3db; Unreal Engine - USceneComponent&#x1f4da; 定義&#x1f3f7; 類繼承? 關鍵特性?? 常見配置&#x1f6e0;? 使用方法&#x1f517; 創建與掛載&#x1f504; 獲取與修改 Transform&#x1f9e9; 附加/分離組件&#x1f3ca; 典型應用場景&#x1…

2025年9月5090工作站、

在深度學習與大模型訓練領域&#xff0c;算力是決定研發效率與模型性能的核心要素&#xff0c;而顯卡作為算力輸出的核心硬件&#xff0c;其性能參數直接影響著訓練任務的速度、穩定性與成本控制。對于企業與科研機構而言&#xff0c;選擇一套適配自身需求且性價比優異的顯卡及…

亞矩陣云手機:亞馬遜第三方店鋪多賬號安全合規運營的核心技術支撐

亞矩陣云手機在亞馬遜第三方店鋪多賬號安全合規運營的技術支持&#xff0c;通過硬件級虛擬化、AI 行為建模、動態資源調度三大核心技術模塊&#xff0c;構建了覆蓋設備、網絡、行為、數據的四維防御體系&#xff0c;確保賬號在亞馬遜平臺規則下的長期穩定運行。以下從技術架構、…

使用C++11改進工廠方法模式:支持運行時配置的增強實現

在軟件開發中&#xff0c;工廠方法模式是一種常用的設計模式&#xff0c;用于創建對象。通過使用C11的新特性&#xff0c;我們可以進一步改進工廠方法模式&#xff0c;使其更加靈活和高效。本文將詳細介紹如何使用C11的std::function、lambda表達式和智能指針來實現一個支持運行…

小程序插件使用

插件介紹 插件是對一組 js 接口、自定義組件 或頁面的封裝&#xff0c;用于嵌入到小程序中使用。插件不能獨立運行&#xff0c;必須嵌入在其他小程序中才能被用戶使用&#xff1b;而第三方小程序在使用插件時&#xff0c;也無法看到插件的代碼。因此&#xff0c;插件適合用來封…

要區分一張圖片中的網狀圖(如網格結構或規則紋理)和噪點(隨機分布的干擾像素),比如電路的方法 計算機視覺

要區分一張圖片中的網狀圖&#xff08;如網格結構或規則紋理&#xff09;和噪點&#xff08;隨機分布的干擾像素&#xff09;&#xff0c;需結合圖像預處理、特征提取和分割算法。以下是系統化的解決方案&#xff0c;分階段說明關鍵技術和算法選擇&#xff1a; &#x1f50d; 一…

06_并發編程高級特性

第6課:并發編程高級特性 課程目標 掌握context包的使用 理解sync包中的同步原語 學會處理并發安全問題 掌握性能優化技巧 1. Context包 1.1 Context基礎 import ("context""fmt""time" )// 基本Context使用 func basicContext()

X00238-非GNSS無人機RGB圖像衛星圖像視覺定位python

獲取方式見文末&#xff0c;可開發票隨著無人機在工業和科研領域應用的加速發展&#xff0c;在非城市環境中使用無gnss、基于視覺的方法進行無人機定位的需求日益增長。本文提出了一種基于視覺的定位算法&#xff0c;利用深度特征計算無人機在野外飛行的地理坐標。該方法基于匹…

Eino 開源框架全景解析 - 以“大模型應用的搭積木指南”方式理解

Eino 開源框架全景解析 - 大模型應用的搭積木指南 &#x1f3af; 什么是 Eino&#xff1f;一句話概括 Eino 是字節跳動開源的大語言模型應用開發框架&#xff0c;就像是一個專門為 AI 應用設計的"搭積木工具箱"&#xff0c;讓開發者能夠像搭樂高一樣輕松構建復雜的 A…

嵌入式開發中,usb通信中輸出端點和輸入端點

一. 簡介本文簡單學習一下&#xff0c;嵌入式開發中&#xff0c;usb的輸出端點和輸入端點。在嵌入式開發的 USB 通信場景中&#xff0c;輸出端點&#xff08;OUT Endpoint&#xff09; 和 輸入端點&#xff08;IN Endpoint&#xff09; 是 USB 設備與主機&#xff08;如電腦、嵌…

【自用】Maven常用依賴

【自用】Maven常用依賴 工具類 Guava Guava&#xff08;Google Guava&#xff09;是由Google團隊開發的一套Java開源工具庫&#xff0c;旨在簡化和增強Java開發者的日常工作。它提供了許多實用的工具和基礎設施&#xff0c;覆蓋了集合、并發、字符串處理、I/O、數學運算等多個…

Java 18 新特性及具體應用

目錄 1. UTF-8 默認編碼 (JEP 400) 2. 簡單 Web 服務器 (JEP 408) 3. Javadoc 代碼片段 (JEP 413) 4. switch 模式匹配 (JEP 420, 第二次預覽) 5. 向量 API (JEP 417, 第三次孵化) 總結 Java 18 于 2022 年 3 月發布&#xff0c;引入了多項新特性&#xff0c;旨在提升開發…

unistd.h 常用函數速查表

在這篇文章中&#xff0c;我們將整理一份 unistd.h 常用函數速查表&#xff0c;便于快速查找和記憶&#xff0c;涵蓋文件 I/O、進程管理、系統信息、用戶/組信息等方面。unistd.h 常用函數速查表&#xff08;POSIX/Linux/macOS&#xff09; 1. 文件與 I/O 操作函數說明示例int …

【電子通識】芯片生產考驗“三重門”之CP、FT與WAT測試

在我們日常生活中&#xff0c;從手機、電腦到汽車、家電&#xff0c;都離不開一顆顆小小的芯片。你可曾想過&#xff0c;這些功能強大的芯片在出廠前要經過怎樣嚴苛的“體檢”才能保證質量可靠&#xff1f;今天&#xff0c;我們就來聊聊芯片制造過程中三道至關重要的測試關卡&a…

Java RESTful API 構建從入門到精通:一步步打造高效后端服務

還在為高昂的AI開發成本發愁?這本書教你如何在個人電腦上引爆DeepSeek的澎湃算力! 在當今數字化時代,RESTful API 已成為現代Web應用的核心組成部分,它提供了一種標準化、靈活的方式來實現前后端分離和跨平臺數據交互。本文作為一篇完整的指南,將從基礎概念入手,詳細闡述…

TypeScript 接口(interface)

一、接口基礎概念接口&#xff08;interface&#xff09;是 TypeScript 的核心類型系統工具&#xff0c;用于定義對象的結構規范。它不關心具體實現細節&#xff0c;只強制要求符合接口定義的對象必須包含指定屬性和方法。例如&#xff1a;interface Person {name: string;age:…

selenium3.141.0執行JS無法傳遞element解決方法

問題&#xff1a;在Chrome 131版本以下執行下面代碼沒有問題&#xff0c;但是在131版本以上出現element無法傳遞問題&#xff0c;執行下面代碼會出現 "Message: javascript error: Cannot read properties of undefined (reading click)"# xpath匹配元素&#xff0c;…

汽車主機廠為何開始押注平臺化視覺?

近年來&#xff0c;隨著智能制造、出口質量標準、新能源整車結構復雜度等多重因素疊加&#xff0c;越來越多主機廠開始從“點狀部署”轉向“系統化導入”&#xff0c;平臺化的AI視覺檢測體系正逐步成為整車廠的標準化選項。在過去&#xff0c;汽車制造四大車間——焊裝、涂裝、…