從零開始的嵌入式學習day33

網絡編程及相關概念
UDP網絡通信程序
UDP網絡通信操作
一、網絡編程及相關概念
1. 網絡編程概念:
? ? ? ? 指通過計算機網絡實現程序間通信的技術,涉及協議、套接字、數據傳輸等核心概念。常見的應用場景包括客戶端-服務器模型、分布式系統、實時通信等。

2.OSI模型概述及結構
? ? ? ? 1)概述:OSI(Open Systems Interconnection)模型是一種用于描述網絡通信過程的標準化框架,由國際標準化組織(ISO)于1984年提出。它將網絡通信劃分為7個層次,每一層負責特定的功能,并通過接口與相鄰層交互。

? ? ? ? 2)OSI模型的七層結構

? ? ? ? 物理層(Physical Layer)負責傳輸原始比特流,定義物理介質(如電纜、光纖)的電氣、機械特性。典型協議包括以太網、USB。

? ? ? ? 數據鏈路層(Data Link Layer)將比特流組織為幀(Frame),提供物理地址(MAC地址)和錯誤檢測。交換機在此層操作,協議如PPP、HDLC。

? ? ? ? 網絡層(Network Layer)負責路由選擇和數據包轉發,使用邏輯地址(如IP地址)。核心設備是路由器,協議包括IP、ICMP。

? ? ? ? 傳輸層(Transport Layer)確保端到端的可靠傳輸,提供流量控制和錯誤恢復。主要協議有TCP(可靠)和UDP(不可靠)。

? ? ? ?會話層(Session Layer) ?管理通信會話的建立、維護和終止,例如NetBIOS。

? ? ? ?表示層(Presentation Layer)處理數據格式轉換(如加密、壓縮),確保應用層可理解數據。例如SSL/TLS加密。

? ? ? ?應用層(Application Layer)直接為用戶應用提供服務,協議包括HTTP、FTP、SMTP。

3.TCP/IP模型概述及結構
? ? ? ? 1)概述:TCP/IP模型是互聯網通信的核心框架,由四層組成:網絡接口層、網絡層、傳輸層和應用層。它比OSI七層模型更簡潔,實際應用更廣泛。

? ? ? ? 2)TCP/IP模型的四層結構:

? ? ? ? 網絡接口層(Link Layer)負責物理傳輸,包括以太網、Wi-Fi等協議。數據以幀為單位傳輸,處理MAC地址和硬件交互。

? ? ? ? 網絡層(Internet Layer) 核心協議為IP(Internet Protocol),負責路由和邏輯尋址。關鍵協議包括:

IP:無連接的數據包傳輸
ICMP:錯誤報告和診斷(如ping)
ARP:IP地址到MAC地址的映射
? ? ? ? 傳輸層(Transport Layer)提供端到端通信,主要協議:TCP(可靠連接,三次握手建立連接)、UDP(無連接,低延遲)。

? ? ? ? 應用層(Application Layer)包含高層協議如HTTP、FTP、DNS等。數據單位為消息。

? ? ? ? 3)數據封裝過程:發送端自上而下封裝------接收端自下而上解封裝

應用數據添加應用層頭(如HTTP頭)
傳輸層添加TCP/UDP頭
網絡層添加IP頭
網絡接口層添加幀頭和尾

4.OSI模型與TCP/IP模型對比
TCP/IP層OSI層
應用層應用層+表示層+會話層
傳輸層傳輸層
網絡層網絡層
網絡接口層數據鏈路層+物理層

實際應用要點
IP地址分為IPv4(32位)和IPv6(128位)
端口號范圍:0-65535(系統端口:0-1023)
MTU(最大傳輸單元)影響數據分片
路由選擇通過路由表實現
該模型的設計強調端到端原則,將復雜性放在網絡邊緣,核心網絡保持簡單高效。

5.DNS域名解析原理
? ? ? ? DNS(Domain Name System)將人類可讀的域名(如example.com)轉換為機器可讀的IP地址(如93.184.216.34)。解析過程遵循分層查詢機制:

? ? ? ? 1)遞歸查詢:用戶設備向遞歸DNS服務器(如ISP提供的服務器)發起請求,由遞歸服務器完成后續查詢并返回最終結果。
? ? ? ? 2)迭代查詢:遞歸服務器依次向根域名服務器、頂級域(TLD)服務器和權威域名服務器查詢,最終獲取目標IP。

6.DHCP概述及工作原理
? ? ? ? 1)概述:DHCP(Dynamic Host Configuration Protocol)是一種網絡協議,用于自動分配 IP 地址、子網掩碼、默認網關和其他網絡配置參數給客戶端設備。它簡化了網絡管理,避免了手動配置 IP 地址的繁瑣和錯誤。

? ? ? ? 2)DHCP工作原理:DHCP 使用客戶端-服務器模型,工作流程分為四個階段(DHCPDISCOVER、DHCPOFFER、DHCPREQUEST、DHCPACK):

DHCPDISCOVER:客戶端廣播請求 IP 地址配置。

DHCPOFFER:服務器響應并提供可用 IP 地址。

DHCPREQUEST:客戶端確認選擇服務器提供的配置。

DHCPACK:服務器最終確認分配 IP 地址。

7.IPv4地址分類

????????IPv4地址通常分為A、B、C、D、E五類,主要依據網絡號和主機號的劃分方式:

  1. A類地址:
  • 范圍:1.0.0.0?到?126.255.255.255
  • 第一字節為網絡號,后三個字節為主機號。
  • 子網掩碼:255.0.0.0
  • 適用于大型網絡,如國際組織或大型企業。

?2.B類地址:

  • 范圍:128.0.0.0?到?191.255.255.255
  • 前兩個字節為網絡號,后兩個字節為主機號。
  • 子網掩碼:255.255.0.0
  • 適用于中型網絡,如大學或中型企業。

?3.C類地址:

  • 范圍:192.0.0.0?到?223.255.255.255
  • 前三個字節為網絡號,最后一個字節為主機號。
  • 子網掩碼:255.255.255.0
  • 適用于小型網絡,如家庭或小型辦公室。

?? 4.D類地址:

  • 范圍:224.0.0.0?到?239.255.255.255(網絡號+最大主機號)
  • 用于組播(Multicast)通信,不劃分網絡號和主機號。
  • 主要用于視頻流、在線會議等一對多的通信場景。

?? ? 5.E類地址:

  • 范圍:240.0.0.0?到?255.255.255.255
  • 保留用于實驗和研究,不用于常規網絡通信。

8.單機上網配置
? ? ? ? 1、有網絡接口并插入網線。
? ? ? ? 2、有ip地址
? ? ? ? 3、配置網絡設置

ip: ifconfig ethX X.X.X.X/24 up ?ifconfig ens33 192.168.0.13/24 up ?255.255.255.0
網關: route add default gw x.x.x.x?
DNS: ?vi /etc/resolv.conf ?==>nameserver 8.8.8.8
測試:ping www.baidu.com ?

netstat ?-anp:查看網絡連接狀態

網絡接口:
? ? ? ? 1、socket ?套接字 ==》BSD socket ==》用于網絡通信的一組接口函數。

? ? ? ? ? ? ? ? socket api ?application interface
? ? ? ? 2、ip+port 地址+端口===》地址用來識別主機、端口用來識別應用程序。
? ? ? ? ? ? ? ? ? port分為TCP port / UDP port ?范圍都是: 1-65535,約定1000 以內的端口為系統使用。

網絡字節序 :大端存儲

用htons函數 把端號轉為大端。

用inet addr 函數把IP地址轉為大端。

9.私有IP地址和公有IP地址

? ? ? ? 1)私有IP:用于局域網內部通信,不直接暴露在互聯網上。

范圍包括:
A類:10.0.0.0 到 10.255.255.255
B類:172.16.0.0 到 172.31.255.255
C類:192.168.0.0 到 192.168.255.255
通常通過NAT(網絡地址轉換)與公網通信。

? 2)公有IP:用于互聯網通信,全球唯一。

????????除私有IP和特殊保留地址外的其他IPv4地址

二、UDP網絡通信程序
1.UDP概述
? ? ? ? UDP(User Datagram Protocol,用戶數據報協議)是一種無連接的傳輸層協議,提供簡單的、不可靠的數據傳輸服務。與 TCP 不同,UDP 不保證數據包的順序、可靠性或流量控制,但具有低延遲和高效率的特點。

2.UDP特征
無連接:通信前無需建立連接,直接發送數據。
不可靠:不保證數據包是否到達目的地,也不保證順序。
高效:頭部開銷小(僅 8 字節),適合對延遲敏感的應用。
支持廣播和多播:可以同時向多個目標發送數據。
3.UDP頭部結構
? ? ? ? ?UDP 頭部包含 4 個字段,每個字段 2 字節:

? ? ? ? 1)源端口(Source Port):發送方端口號(可選,可設為 0)。

? ? ? ? 2)目標端口(Destination Port):接收方端口號。

? ? ? ? 3)長度(Length):UDP 頭部加數據的總長度(最小為 8)。

? ? ? ? 4)校驗和(Checksum):用于錯誤檢測(可選,IPv6 必須校驗)。

4.UDP適用場景:
實時應用:如視頻流、語音通話(VoIP)、在線游戲。
DNS 查詢:快速響應比可靠性更重要。
廣播/多播:如 DHCP、網絡發現協議。
簡單請求-響應:如 SNMP、TFTP。
5.UDP與TCP對比:
特性?? ?UDP?? ?TCP
連接方式?? ?無連接?? ?面向連接
可靠性?? ?不可靠?? ?可靠(重傳、確認機制)
流量控制?? ?無?? ?有(滑動窗口)
順序保障?? ?不保證?? ?保證
頭部大小?? ?8 字節?? ?20 字節
適用場景?? ?實時、低延遲應用?? ?文件傳輸、網頁瀏覽
UDP 的局限性:
無擁塞控制:可能引發網絡擁塞。
數據包丟失:不適合需要高可靠性的場景。
安全性:容易受到 DDOS 攻擊(如 UDP 洪水攻擊)。

三、UDP網絡通信操作

1.socket():創建套接字,返回文件描述符。

#include <sys/socket.h>

int socket(int domain, int type, int protocol);

? ? ? ? 參數:domain:協議族(如AF_INET IPv4,AF_INET6 IPv6)。

? ? ? ? ? ? ? ? ? ? ? ? 參數:PF_INET == AF_INET ==>互聯網程序
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? PF_UNIX == AF_UNIX ==>單機程序

? ? ? ? ? ? ? ? type:套接字類型(如SOCK_STREAM TCP,SOCK_DGRAM UDP)。
? ? ? ? ? ? ? ? ? ? ? ? ? ?SOCK_STREAM ?流式套接字 ===》TCP ??
? ? ? ? ? ? ? ? ? ? ? ? ? SOCK_DGRAM ? 用戶數據報套接字===>UDP
? ? ? ? ? ? ? ? ? ? ? ? ? SOCK_RAW ? ? 原始套接字 ?===》IP
? ? ? ? ? ? ? ? protocol 協議 ==》0 表示自動適應應用層協議。通常為0,自動匹配。

2.bind():將套接字綁定到特定IP和端口。

int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

? ? ? ? 參數:

sockfd:socket()返回的文件描述符。
addr:指向sockaddr結構的指針(需轉換為struct sockaddr_in或sockaddr_in6)。
struct sockaddr ? ? ?通用地址結構
? {
? u_short sa_family; ?地址族
? char sa_data[14]; ? 地址信息
? };

轉換成網絡地址結構如下:
? struct _sockaddr_in ? ?///網絡地址結構
? {
? u_short ? ?sin_family; 地址族
? u_short ? ?sin_port; ? ///地址端口
? struct in_addr ?sin_addr; ? ///地址IP
? char ? ?sin_zero[8]; 占位
? };

addrlen:地址結構長度。
? ? ? ? 注意:如果是客戶端,則該函數省略,由默認接口發送數據。

3.recvfrom():用于從套接字接收數據的系統調用,常用于無連接協議(如UDP)。與recv不同,recvfrom可以獲取發送端的地址信息。

#include <sys/socket.h>
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
? ? ? ? ? ? ? ? ?struct sockaddr *src_addr, socklen_t *addrlen);

? ? ? ? 參數:

sockfd: 套接字描述符
buf: 接收數據的緩沖區指針
len: 緩沖區長度
flags: 控制標志(常用值如MSG_WAITALL、MSG_DONTWAIT)
src_addr: 發送方地址結構體指針(可為NULL)
addrlen: 地址結構體長度指針(輸入輸出參數)
? ? ? ? 返回值:

成功時返回接收的字節數
失敗返回-1并設置errno
連接關閉時返回0
4.sendto():用于發送數據的系統調用,用于無連接協議(UDP)或需要指定目標地址的場景。它允許直接向特定目標發送數據而不需要預先建立連接。

#include <sys/types.h>
#include <sys/socket.h>
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: 指向目標地址結構體的指針
addrlen: 目標地址結構體的長度
? ? ? ? 返回值:成功時返回發送的字節數,失敗返回-1并設置errno。

示例:用UDP完成現在實時聊天

服務器端:

#include <arpa/inet.h>
#include <netinet/in.h>
#include <netinet/ip.h> /* superset of previous */
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h> /* See NOTES */
#include <time.h>
#include <unistd.h>
typedef struct sockaddr *(SA);
int main(int argc, char *argv[]) {int sockfd = socket(AF_INET, SOCK_DGRAM, 0);if (-1 == sockfd) {perror("socket");return 1;}struct sockaddr_in ser, cli; // client  man 7 ipbzero(&ser, sizeof(ser));bzero(&cli, sizeof(cli));ser.sin_family = AF_INET;ser.sin_port = htons(50000);             // host to net shortser.sin_addr.s_addr = htonl(INADDR_ANY); // 小端轉大端  本地回環  127int ret = bind(sockfd, (SA)&ser, sizeof(ser));if (-1 == ret) {perror("bind");return 1;}socklen_t len = sizeof(cli);char buf[256] = {0};recvfrom(sockfd, buf, sizeof(buf), 0, (SA)&cli, &len);pid_t pid = fork();if (pid > 0) {while (1) {char buf[256] = {0};recvfrom(sockfd, buf, sizeof(buf), 0, (SA)&cli, &len);if (0 == strcmp(buf, "#quit\n")) {kill(pid, 9);exit(0);}printf("cli:%s", buf);fflush(stdout);}} else if (0 == pid) {while (1) {char buf[256] = {0};printf("to cli:");fgets(buf, sizeof(buf), stdin);sendto(sockfd, buf, strlen(buf), 0, (SA)&cli, sizeof(cli));if (0 == strcmp(buf, "#quit\n")) {kill(getppid(), 9);exit(0);}}} else {perror("fork");return 1;}return 0;
}

客戶端:?

?

#include <arpa/inet.h>
#include <netinet/in.h>
#include <netinet/ip.h> /* superset of previous */
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h> /* See NOTES */
#include <time.h>
#include <unistd.h>
typedef struct sockaddr *(SA);
int main(int argc, char *argv[]) {int sockfd = socket(AF_INET, SOCK_DGRAM, 0);if (-1 == sockfd) {perror("socket");return 1;}struct sockaddr_in ser, cli; // client  man 7 ipbzero(&ser, sizeof(ser));bzero(&cli, sizeof(cli));ser.sin_family = AF_INET;ser.sin_port = htons(50000);                      // host to net shortser.sin_addr.s_addr = inet_addr("192.168.0.165"); // 小端轉大端socklen_t len = sizeof(cli);char buf[256] = {0};strcpy(buf, "start");sendto(sockfd, buf, strlen(buf), 0, (SA)&ser, sizeof(ser));pid_t pid = fork();if (pid > 0) {while (1) {char buf[256] = {0};recvfrom(sockfd, buf, sizeof(buf), 0, NULL, NULL);if (0 == strcmp(buf, "#quit\n")) {kill(pid, 9);exit(0);}printf("ser:%s", buf);fflush(stdout);}} else if (0 == pid) {while (1) {char buf[256] = {0};printf("to ser:");fgets(buf, sizeof(buf), stdin);sendto(sockfd, buf, strlen(buf), 0, (SA)&ser, sizeof(ser));if (0 == strcmp(buf, "#quit\n")) {kill(getppid(), 9);exit(0);}}} else {perror("fork");return 1;}close(sockfd);return 0;
}

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

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

相關文章

Kotlin 1. 搭建Kotlin開發環境

本實戰概述旨在指導用戶搭建Kotlin開發環境&#xff0c;并進行簡單的編程實踐。首先&#xff0c;用戶需安裝IntelliJ IDEA&#xff0c;并進行基本設置&#xff0c;如選擇主題、調整字體和安裝插件等。接著&#xff0c;創建Kotlin項目&#xff0c;設置項目名稱、位置和JDK版本&a…

Mysql的B-樹和B+樹的區別總結

B 樹也稱 B- 樹&#xff0c;全稱為 多路平衡查找樹&#xff0c;B 樹是 B 樹的一種變體。B 樹和 B 樹中的 B 是 Balanced&#xff08;平衡&#xff09;的意思。 目前大部分數據庫系統及文件系統都采用 B-Tree 或其變種 BTree 作為索引結構。 B 樹& B 樹兩者有何異同呢&…

COMSOL學習筆記-靜電場仿真

最近在學習COMSOL&#xff0c;做了一個靜電場仿真的例子&#xff0c;分享一下。 參考了下面的官方案例 計算電容 電容式位置傳感器的邊界元建模 三維模型 首先對靜電測試儀進行三維建模。 Comsol靜電場仿真 使用comsol進行靜電場仿真&#xff0c;控制方程為泊松方程&#…

JavaScript 循環方法對比指南

JavaScript 循環方法對比指南 1. 標準 for 循環 語法&#xff1a; for (let i 0; i < arr.length; i) {console.log(arr[i]); }優點 ? 完全控制索引&#xff0c;適合需要精確控制遍歷順序或步長的場景。 ? 性能最優&#xff0c;在超大規模數據遍歷時比高階方法&#x…

【快餐點餐簡易軟件】佳易王快餐店點餐系統軟件功能及操作教程

一、軟件概述與核心優勢 &#xff08;一&#xff09;試用版獲取方式 資源下載路徑&#xff1a;進入博主頭像主頁第一篇文章末尾&#xff0c;點擊卡片按鈕&#xff1b;或訪問左上角博客主頁&#xff0c;通過右側按鈕獲取詳細資料。 說明&#xff1a;下載文件為壓縮包&#xff…

智慧園區數字孿生全鏈交付方案:降本增效30%,多案例實踐驅動全周期交付

在智慧園區建設浪潮中&#xff0c;數字孿生技術正成為破解傳統園區管理難題的核心引擎。通過構建與物理園區1:1映射的數字模型&#xff0c;實現數據集成、狀態同步與智能決策&#xff0c;智慧園區數字孿生全鏈交付方案已在多個項目中驗證其降本增效價值——某物流園區通過該方案…

從0開始學vue:Element Plus詳解

一、核心架構解析二、技術實現指南三、高級特性實現四、性能優化方案五、生態擴展方案六、調試與測試七、版本演進路線 Element Plus 是專為 Vue 3 設計的桌面端 UI 組件庫&#xff0c;基于 Vue 3 的 Composition API 重構&#xff0c;在保持與 Element UI 兼容性的同時&#x…

Ubuntu系統配置C++的boost庫(含filesystem模塊)的方法

本文介紹在具有sudo權限的Ubuntu操作系統中&#xff0c;配置C 的boost庫的方法。 boost庫是一個廣受歡迎的C 庫集合&#xff0c;提供了許多強大的功能擴展——例如其中的filesystem模塊&#xff0c;可簡化文件和目錄操作&#xff0c;讓開發者可以輕松處理跨平臺的文件系統任務。…

Java集合中Stream流的使用

前言 Java 8 引入了 Stream API&#xff0c;它是一種用于處理集合&#xff08;Collection&#xff09;數據的強大工具。Stream 不是數據結構&#xff0c;而是對數據源進行操作的一種方式&#xff0c;支持聲明式、函數式的操作&#xff0c;如過濾、映射、排序等。 Stream 操作…

.Net Framework 4/C# 屬性和方法

一、屬性的概述 屬性是對實體特征的抽象&#xff0c;用于提供對類或對象的訪問&#xff0c;C# 中的屬性具有訪問器&#xff0c;這些訪問器指定在它們的值被讀取或寫入時需要執行的語句&#xff0c;因此屬性提供了一種機制&#xff0c;用于把讀取和寫入對象的某些特征與一些操作…

asp.net mvc如何簡化控制器邏輯

在ASP.NET MVC中&#xff0c;可以通過以下方法簡化控制器邏輯&#xff1a; ASP.NET——MVC編程_aspnet mvc-CSDN博客 .NET/ASP.NET MVC Controller 控制器&#xff08;IController控制器的創建過程&#xff09; https://cloud.tencent.com/developer/article/1015115 【轉載…

flask功能使用總結和完整示例

Flask 功能使用總結與完整示例 一、Flask 核心功能總結 Flask 是輕量級 Web 框架&#xff0c;核心功能包括&#xff1a; 路由系統&#xff1a;通過 app.route 裝飾器定義 URL 與函數的映射。模板引擎&#xff1a;默認使用 Jinja2&#xff0c;支持動態渲染 HTML。請求處理&…

HarmonyOS應用基礎階段- 09、綜合案例-仿攜程旅行口碑榜

文章目錄 攜程-口碑榜1、banner 區域1.1 區域部分1.2 口碑榜 Logo1.3 推薦榜單1.4 評分規則1.5 底部 Line 2、選擇城市和目的地2.1 區域布局2.2 選擇城市2.3 口碑目的地 3、商業選項菜單4、熱門項目選項4.1 區域布局4.2 熱門標題4.3 選項 5、熱門榜標題6、熱門景點列表6.1 區域…

中小制造企業轉型:低成本國產工業軟件替代方案實踐

在數字經濟浪潮席卷全球的當下&#xff0c;制造業數字化轉型已成為企業提升競爭力、實現可持續發展的必由之路。然而&#xff0c;高昂的成本與復雜的技術門檻&#xff0c;卻讓眾多中小制造企業陷入 “不能轉、不想轉、不會轉、不敢轉” 的困局。幸運的是&#xff0c;一批具有自…

Kafka 核心架構與消息模型深度解析(二)

案例實戰&#xff1a;Kafka 在實際場景中的應用 &#xff08;一&#xff09;案例背景與需求介紹 假設我們正在為一個大型電商平臺構建數據處理系統。該電商平臺擁有龐大的用戶群體&#xff0c;每天會產生海量的訂單數據、用戶行為數據&#xff08;如瀏覽、點擊、收藏等&#…

【iOS】cache_t分析

前言 之前分析類的結構的時候&#xff0c;有遇到一個cache_t&#xff0c;當時說是用來保存方法緩存的結構&#xff0c;這篇文章來從源碼詳細介紹一下cache_t 概覽cache_t cache_t結構 類在底層的結構如之前所述&#xff0c;存在著cache_t屬性&#xff0c;而cache_t的結構如下…

java面試題:List如何排序?內存溢出/OOM怎么回事?如何排查和解決?

List如何排序 List排序可以通過實現Comparable接口并且實現compareTo方法&#xff0c;或者傳入comparator去實現排序。 內存溢出/OOM是怎么回事&#xff1f; 內存溢出就是程序在運行的過程中&#xff0c;申請的內存超過了最大內存限制&#xff0c;導致JVM拋出OOM異常&#x…

Python cryptography【密碼庫】庫功能與使用指南

邊寫代碼零食不停口 盼盼麥香雞味塊 、卡樂比&#xff08;Calbee&#xff09;薯條三兄弟 獨立小包、好時kisses多口味巧克力糖、老金磨方【黑金系列】黑芝麻丸 邊寫代碼邊貼面膜 事業美麗兩不誤 DR. YS 野森博士【AOUFSE/澳芙雪特證】377專研美白淡斑面膜組合 優惠劵 別光顧寫…

第二十四章 流程控制_ if分支

第二十四章 流程控制: if分支和輸入 正如許多編程語言一樣Shell也有自己的條件分支語句。有時需要根據情況進行相應的處理&#xff0c;因此可以通過條件分支語句實現&#xff0c;本章主要介紹的是if分支語句。 if語句 在Shell中if語句語法格式如下&#xff1a; if commands…

電腦網絡重置,找不到原先自家的WIFI,手機還能正常連接并上網

問題排查&#xff1a;1、電腦感覺網絡太慢&#xff0c;因此打算點擊了網絡重置 2、點擊提示會刪除網絡&#xff0c;在五分鐘后關機重啟 3、從設備管理器設備的無線wifi屬性-事件中發現刪除記錄 4、選擇更新驅動程序 5、從列表中選取 6、更改回老驅動版本 備選方案&#…