国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Linux應用開發【第六章】網絡編程應用開發

weidongshan ? 來源:weidongshan ? 作者:weidongshan ? 2021-12-10 19:17 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

文章目錄

6 網絡編程應用開發

6.1 網絡編程簡介

6.1.1 五層因特網協議棧

6.1.2 傳輸層和應用層的常見協議

6.2 網絡編程之TCP/UDP比較

6.2.1 TCP和UDP 原理上的區別

6.2.2 為何存在UDP協議

6.2.3 TCP/UDP網絡通信大概交互圖

6.3 網絡編程主要函數介紹

6.3.1 socket函數

6.3.2 bind函數

6.3.3 listen函數

6.3.4 accept函數

6.3.5 connect函數

6.3.6 send函數

6.3.7 recv函數

6.3.8 recvfrom函數

6.3.9 sendto函數

6.4 TCP編程簡單示例

6.4.1 服務器端代碼

6.4.2 客戶端代碼

6.4.3 Makefile文件

6.4.4 執行

6.5 UDP編程簡單示例

6.5.1 服務器端代碼

6.5.2 客戶端代碼

6.5.2.1 客戶端程序1

6.5.2.2 客戶端程序2

6.5.3 Makefile文件

6.5.4 執行

6 網絡編程應用開發

6.1 網絡編程簡介

要編寫通過計算機網絡通信的程序,首先要確定這些程序同通信的協議(protocol),在設計一個協議的細節之前,首先要分清程序是由哪個程序發起以及響應何時產生。

舉例來說,一般認為WEB服務器程序是一個長時間運行的程序(守護進程deamon),它只在響應來自網絡的請求時才發送網絡消息。協議的另一端是web客戶程序,如某種瀏覽器,與服務器進程的通信總是由客戶進程發起。大多數網絡應用就是按照劃分為客戶(clinet)和服務器(server)來組織的。

6.1.1 五層因特網協議棧

為了給網絡協議的設計提供一個結構,網絡設計者以分層(layer)的方式組織協議以及實現這些協議的網絡硬件和軟件。

分層提供了一種結構化方式來討論系統組件。模塊化使更新系統組件更為容易。

協議棧是各層所有協議的總和。

poYBAGGzNzWAdICbAAATy_4rwtM378.png

五層因特網協議棧

應用層:應用層是網絡應用程序及它們的應用層協議存留的地方。

運輸層:因特網的運輸層在應用程序端點之間傳從應用層報文。

網絡層:因特網呃網絡層負責將稱為數據包(datagram)的網絡層分組從一臺主機移動到另一臺主機。

鏈路層:因特網的網絡層通過源和目的地之間的一系列路由器路由數據報。

物理層:雖然鏈路層的任務是將整個幀從一個網絡元素移動到臨近的網絡元素,而物理層的任務是將該幀的一個一個比特從一個節點移動到下一個節點。

6.1.2 傳輸層和應用層的常見協議

我們重點介紹和應用層編程關系密切的應用層和運輸層。

應用層:

因特網的應用層包含很多協議,例如HTTP,SMTP,和 FTP。我們看到的某些網絡功能,比如將www.baidu.com這樣對人友好的端系統名字轉換為32比特網絡地址,也是借助于特定的應用層協議即域名系統(DNS)完成的。

應用層的協議分布在多個端系統上,一個端系統中的應用程序使用協議與另一個端系統中的應用程序交換信息分組。

運輸層:

在英特網中有兩個運輸協議,即TCP和UDP,利用其中的任何一個都能運輸應用層報文。我們寫應用程序的時候具體選擇哪個運輸層協議應該根據實際情況來確定(后面會具體講解)。

6.2 網絡編程之TCP/UDP比較

6.2.1 TCP和UDP 原理上的區別

TCP向它的應用程序提供了面向連接的服務。這種服務包括了應用層報文向目的地的確保傳遞和流量控制(即發送方/接收方速率匹配)。這種服務包括了應用層報文劃分為短報文,并提供擁塞控制機制,因此當網絡擁塞時源抑制其傳輸速率。

UDP協議向它的應用程序提供無連接服務。這是一種不提供不必要服務的服務,沒有可靠性,沒有流量控制,也沒有擁塞控制。

6.2.2 為何存在UDP協議

既然TCP提供了可靠數據傳輸服務,而UDP不能提供,那么TCP是否總是首選呢?答案是否定的,因為有許多應用更適合用UDP,原因有以下幾點:

a. 關于何時發送什么數據控制的更為精細。

采用UDP時只要應用進程將數據傳遞給UDP,UDP就會立即將其傳遞給網絡層。而TCP有重傳機制,而不管可靠交付需要多長時間。但是實時應用通常不希望過分的延遲報文段的傳送,且能容忍一部分數據丟失。

b. 無需建立連接,不會引入建立連接時的延遲。

c. 無連接狀態,能支持更多的活躍客戶。

d. 分組首部開銷較小。

6.2.3 TCP/UDP網絡通信大概交互圖

下面我們分別畫出運用TCP協議和運用UDP協議的客戶端和服務器大概交互圖。

pYYBAGGzNzuAa_SNAABSurUuxzU563.png

面向連接的TCP流模式

poYBAGGzN0GAaiaoAAAz9Vs51Gs694.png

UDP用戶數據包模式

6.3 網絡編程主要函數介紹

6.3.1 socket函數

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

此函數用于創建一個套接字。

domain是網絡程序所在的主機采用的通訊協族(AF_UNIX和AF_INET等)。

AF_UNIX只能夠用于單一的Unix 系統進程間通信,而AF_INET是針對Internet的,因而可以允許遠程通信使用。

type是網絡程序所采用的通訊協議(SOCK_STREAM,SOCK_DGRAM等)。

SOCK_STREAM表明用的是TCP 協議,這樣會提供按順序的,可靠,雙向,面向連接的比特流。

SOCK_DGRAM 表明用的是UDP協議,這樣只會提不可靠,無連接的通信。

關于protocol,由于指定了type,所以這個地方一般只要用0來代替就可以了。

此函數執行成功時返回文件描述符,失敗時返回-1,看errno可知道出錯的詳細情況。

6.3.2 bind函數

int bind(int sockfd, struct sockaddr *my_addr, int addrlen);

從函數用于將地址綁定到一個套接字。

sockfd是由socket函數調用返回的文件描述符。

my_addr是一個指向sockaddr的指針。

addrlen是sockaddr結構的長度。

sockaddr的定義:

struct sockaddr{ unisgned short as_family; char sa_data[14]; };

不過由于系統的兼容性,我們一般使用另外一個結構(struct sockaddr_in) 來代替。

sockaddr_in的定義:

struct sockaddr_in{ unsigned short sin_family; unsigned short int sin_port; struct in_addr sin_addr; unsigned char sin_zero[8]; }

如果使用Internet所以sin_family一般為AF_INET。

sin_addr設置為INADDR_ANY表示可以和任何的主機通信。

sin_port是要監聽的端口號。

bind將本地的端口同socket返回的文件描述符捆綁在一起.成功是返回0,失敗的情況和socket一樣。

6.3.3 listen函數

int listen(int sockfd,int backlog);

此函數宣告服務器可以接受連接請求。

sockfd是bind后的文件描述符。

backlog設置請求排隊的最大長度。當有多個客戶端程序和服務端相連時,使用這個表示可以介紹的排隊長度。

listen函數將bind的文件描述符變為監聽套接字,返回的情況和bind一樣。

6.3.4 accept函數

int accept(int sockfd, struct sockaddr *addr,int *addrlen);

服務器使用此函數獲得連接請求,并且建立連接。

sockfd是listen后的文件描述符。

addr,addrlen是用來給客戶端的程序填寫的,服務器端只要傳遞指針就可以了, bind,listen和accept是服務器端用的函數。

accept調用時,服務器端的程序會一直阻塞到有一個客戶程序發出了連接。 accept成功時返回最后的服務器端的文件描述符,這個時候服務器端可以向該描述符寫信息了,失敗時返回-1 。

6.3.5 connect函數

int connect(int sockfd, struct sockaddr * serv_addr,int addrlen);

可以用connect建立一個連接,在connect中所指定的地址是想與之通信的服務器的地址。

sockfd是socket函數返回的文件描述符。

serv_addr儲存了服務器端的連接信息,其中sin_add是服務端的地址。

addrlen是serv_addr的長度

connect函數是客戶端用來同服務端連接的.成功時返回0,sockfd是同服務端通訊的文件描述符,失敗時返回-1。

6.3.6 send函數

ssize_t send(int sockfd, const void *buf, size_t len, int flags);

sockfd指定發送端套接字描述符;

buf指明一個存放應用程序要發送數據的緩沖區;

len指明實際要發送的數據的字節數;

flags一般置0。

客戶或者服務器應用程序都用send函數來向TCP連接的另一端發送數據

6.3.7 recv函數

ssize_t recv(int sockfd, void *buf, size_t len, int flags);

sockfd指定接收端套接字描述符;

buf指明一個緩沖區,該緩沖區用來存放recv函數接收到的數據;

len指明buf的長度;

flags一般置0。

客戶或者服務器應用程序都用recv函數從TCP連接的另一端接收數據。

6.3.8 recvfrom函數

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);

recvfrom通常用于無連接套接字,因為此函數可以獲得發送者的地址。

src_addr是一個struct sockaddr類型的變量,該變量保存源機的IP地址及端口號。

addrlen常置為sizeof (struct sockaddr)。

6.3.9 sendto函數

ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);

sendto和send相似,區別在于sendto允許在無連接的套接字上指定一個目標地址。

dest_addr表示目地機的IP地址和端口號信息,

addrlen常常被賦值為sizeof (struct sockaddr)。

sendto函數也返回實際發送的數據字節長度或在出現發送錯誤時返回-1。

6.4 TCP編程簡單示例

服務器首先進行初始化操作:調用函數socket創建一個套接字,函數bind將這個套接字與服務器的公認地址綁定在一起,函數listen將這個套接字換成傾聽套接字,然后調用函數accept來等待客戶機的請求。過了一段時間后,客戶機啟動,調用socket創建一個套接字,然后調用函數connect來與服務器建立連接。連接建立之后,客戶機和服務器通過讀、寫套接字來進行通信。

6.4.1 服務器端代碼

參考:TCP/server_line.c

1#include 2#include 3#include 4#include 5#include 6#include 7#include 8#include 9#include 10 11#define SERVER_PORT 8180 12#define C_QUEUE 10 13 14/************************************************************ 15*函數功能描述:從8180端口接收客戶端數據 16*輸入參數:無 17*輸出參數:打印客戶IP以及發來的信息 18*返回值:無 19*修改日期 版本號 修改人 修改內容 20*2020/05/13 v1.0.0 zonghzha reat 21*************************************************************/ 22 23int main(int argc, char **argv) 24{ 25 char buf[512]; 26 int len; 27 int duty_socket; 28 int customer_socket; 29 struct sockaddr_in socket_server_addr; 30 struct sockaddr_in socket_client_addr; 31 int ret; 32 int addr_len; 33 34 signal(SIGCHLD, SIG_IGN); 35 36 /* 服務器端開始建立socket描述符 */ 37 duty_socket = socket(AF_INET, SOCK_STREAM, 0); 38 if (duty_socket == -1) 39 { 40 printf("socket error"); 41 return -1; 42 } 43 44 /* 服務器端填充 sockaddr_in結構 */ 45 socket_server_addr.sin_family = AF_INET; 46 /* 端口號轉換為網絡字節序 */ 47 socket_server_addr.sin_port = htons(SERVER_PORT); 48 /* 接收本機所有網口的數據 */ 49 socket_server_addr.sin_addr.s_addr = INADDR_ANY; 50 memset(socket_server_addr.sin_zero, 0, 8); 51 52 /* 捆綁sockfd描述符 */ 53 ret = bind(duty_socket, (const struct sockaddr *)&socket_server_addr, sizeof(struct sockaddr)); 54 if (ret == -1) 55 { 56 printf("bind error!n"); 57 return -1; 58 } 59 ret = listen(duty_socket, C_QUEUE); 60 if (ret == -1) 61 { 62 printf("listen error!n"); 63 return -1; 64 } 65 66 while (1) 67 { 68 addr_len = sizeof(struct sockaddr); 69 /* 服務器阻塞,直到客戶程序建立連接 */ 70 customer_socket = accept(duty_socket, (struct sockaddr *)&socket_client_addr, &addr_len); 71 if (customer_socket != -1) 72 { 73 /*inet_ntoa的作用是將一個32位Ipv4地址轉換為相應的點分十進制數串*/ 74 printf("Get connect from %sn", inet_ntoa(socket_client_addr.sin_addr)); 75 } 76 if (!fork()) 77 { 78 while (1) 79 { 80 memset(buf, 512, 0); 81 /*接收數據*/ 82 len = recv(customer_socket, buf, sizeof(buf), 0); 83 buf[len] = ''; 84 if (len <= 0) 85 { 86 close(customer_socket); 87 return -1; 88 } 89 else 90 { 91 printf("Get connect from %s, Msg is %sn", inet_ntoa(socket_client_addr.sin_addr), buf); 92 } 93 } 94 } 95 } 96 97 close(duty_socket); 98 return 0; 99}

6.4.2 客戶端代碼

參考:TCP/client_line.c

1#include 2#include 3#include 4#include 5#include 6#include 7#include 8#include 9 10#define SERVER_PORT 8180 11/************************************************************ 12*函數功能描述:向指定IP的8180端口發送數據 13*輸入參數:點分十進制服務器IP 14*輸出參數:無 15*返回值:無 16*修改日期 版本號 修改人 修改內容 17*2020/05/13 v1.0.0 zonghzha creat 18*************************************************************/ 19 20int main(int argc, char **argv) 21{ 22 unsigned char buf[512]; 23 int len; 24 struct sockaddr_in socket_server_addr; 25 int ret; 26 int addr_len; 27 int client_socket; 28 29 30 if (argc != 2) 31 { 32 printf("Usage:n"); 33 printf("%s n", argv[0]); 34 return -1; 35 } 36 37 /* 客戶程序開始建立 sockfd描述符 */ 38 client_socket = socket(AF_INET, SOCK_STREAM, 0); 39 if (client_socket == -1) 40 { 41 printf("socket error"); 42 return -1; 43 } 44 45 /* 客戶程序填充服務端的資料 */ 46 socket_server_addr.sin_family = AF_INET; 47 /*主機字節序轉換為網絡字節序*/ 48 socket_server_addr.sin_port = htons(SERVER_PORT); 49 if (inet_aton(argv[1], &socket_server_addr.sin_addr) == 0) 50 { 51 printf("invalid server ipn"); 52 return -1; 53 } 54 memset(socket_server_addr.sin_zero, 0, 8); 55 /* 客戶程序發起連接請求 */ 56 ret = connect(client_socket, (const struct sockaddr *)&socket_server_addr, sizeof(struct sockaddr)); 57 if (ret == -1) 58 { 59 printf("connect error!n"); 60 return -1; 61 } 62 63 64 while (1) 65 { 66 if (fgets(buf, sizeof(buf), stdin)) 67 { 68 len = send(client_socket, buf, strlen(buf), 0); 69 if (len <= 0) 70 { 71 close(client_socket); 72 return -1; 73 } 74 } 75 } 76 77 close(client_socket); 78 return 0; 79}

6.4.3 Makefile文件

all:server client server:server.c gcc $^ -o $@ client:client.c gcc $^ -o $@ clean: rm server client -f (注意:命令語句的開頭要用“Tab”鍵。)

6.4.4 執行

服務器端:

./server

客戶端:

./client 127.0.0.1

客戶端輸入:

good night

服務器端顯示:

Get connect from 127.0.0.1 Get connect from 127.0.0.1, Msg is good night

6.5 UDP編程簡單示例

UDP服務器首先進行初始化操作:調用函數socket創建一個數據報類型的套接字,函數bind將這個套接字與服務器的公認地址綁定在一起。然后調用函數recvfrom接收UDP客戶機的數據報。UDP客戶機首先調用函數socket創建一個數據報套接字,然后調用函數sendto向服務器發送數據報。在結束通信后,客戶機調用close關閉UDP套接字,服務器繼續使用這個UDP套接字接收其它客戶機的數據報。

6.5.1 服務器端代碼

參考UDP/server_line.c

1#include 2#include 3#include 4//#include 5#include 6#include 7#include 8#include 9#include 10 11/*服務器端口為8180*/ 12#define SERVER_PORT 8180 13 14/************************************************************ 15*函數功能描述:從8180端口接收客戶端數據 16*輸入參數:無 17*輸出參數:打印客戶IP以及發來的信息 18*返回值:無 19*修改日期 版本號 修改人 修改內容 20*2020/05/13 v1.0.0 zonghzha creat 21*************************************************************/ 22 23 24int main(int argc, char **argv) 25{ 26 unsigned char buf[512]; 27 int len; 28 int duty_socket; 29 int customer_socket; 30 struct sockaddr_in socket_server_addr; 31 struct sockaddr_in socket_client_addr; 32 int ret; 33 int addr_len; 34 35 /* 創建數據報套接字 */ 36 duty_socket = socket(AF_INET, SOCK_DGRAM, 0); 37 if (duty_socket == -1) 38 { 39 printf("socket error"); 40 return -1; 41 } 42 43 /* 服務器端填充 sockaddr_in結構 */ 44 socket_server_addr.sin_family = AF_INET; 45 socket_server_addr.sin_port = htons(SERVER_PORT); 46 socket_server_addr.sin_addr.s_addr = INADDR_ANY; 47 memset(socket_server_addr.sin_zero, 0, 8); 48 49 /*綁定套接字*/ 50 ret = bind(duty_socket, (const struct sockaddr *)&socket_server_addr, sizeof(struct sockaddr)); 51 if (ret == -1) 52 { 53 printf("bind error!n"); 54 return -1; 55 } 56 57 58 while (1) 59 { 60 addr_len = sizeof(struct sockaddr); 61 /* 接收客戶端數據報,返回的為接收到的字節數 */ 62 len = recvfrom(duty_socket, buf, sizeof(buf), 0, (struct sockaddr *)&socket_client_addr, &addr_len); 63 if (len > 0) 64 { 65 buf[len] = ''; 66 printf("Get Msg from %s : %sn", inet_ntoa(socket_client_addr.sin_addr), buf); 67 } 68 69 } 70 71 close(duty_socket); 72 return 0; 73} 74

6.5.2 客戶端代碼

6.5.2.1 客戶端程序1

參考UDP/client_line_1.c

1#include 2#include 3#include 4#include 5#include 6#include 7#include 8 9#define SERVER_PORT 8180 10 11/************************************************************ 12*函數功能描述:向指定IP的8180端口發送數據 13*輸入參數:點分十進制服務器IP 14*輸出參數:無 15*返回值:無 16*修改日期 版本號 修改人 修改內容 17*2020/05/13 v1.0.0 zonghzha creat 18*************************************************************/ 19 20int main(int argc, char **argv) 21{ 22 unsigned char buf[512]; 23 int len; 24 struct sockaddr_in socket_server_addr; 25 int ret; 26 int addr_len; 27 int client_socket; 28 29 30 if (argc != 2) 31 { 32 printf("Usage:n"); 33 printf("%s n", argv[0]); 34 return -1; 35 } 36 37 /*創建套接字*/ 38 client_socket = socket(AF_INET, SOCK_DGRAM, 0); 39 if (client_socket == -1) 40 { 41 printf("socket error"); 42 return -1; 43 } 44 45 /* 填充服務端的資料 */ 46 socket_server_addr.sin_family = AF_INET; 47 socket_server_addr.sin_port = htons(SERVER_PORT); 48 if (inet_aton(argv[1], &socket_server_addr.sin_addr) == 0) 49 { 50 printf("invalid server ipn"); 51 return -1; 52 } 53 memset(socket_server_addr.sin_zero, 0, 8); 54 55 56 57 58 while (1) 59 { 60 if (fgets(buf, sizeof(buf), stdin)) 61 { 62 // len = send(client_socket, buf, strlen(buf), 0); 63 /*向服務器端發送數據報*/ 64 addr_len = sizeof(struct sockaddr); 65 len = sendto(client_socket, buf, sizeof(buf), 0, (struct sockaddr *)&socket_server_addr, addr_len); 66 if (len <= 0) 67 { 68 close(client_socket); 69 return -1; 70 } 71 } 72 } 73 74 close(client_socket); 75 return 0; 76} 77

問:用UDP協議寫網絡通訊程序不可以用connect函數嗎?

答:非也。

6.5.2.2 客戶端程序2

參考UDP/client_line_2.c

1#include 2#include 3#include 4#include 5#include 6#include 7#include 8 9/*服務器端口為8180*/ 10#define SERVER_PORT 8180 11 12/************************************************************ 13*函數功能描述:向指定IP的8180端口發送數據 14*輸入參數:點分十進制服務器IP 15*輸出參數:無 16*返回值:無 17*修改日期 版本號 修改人 修改內容 18*2020/05/13 v1.0.0 zonghzha creat 19*************************************************************/ 20 21int main(int argc, char **argv) 22{ 23 unsigned char buf[512]; 24 int len; 25 struct sockaddr_in socket_server_addr; 26 int ret; 27 int addr_len; 28 int client_socket; 29 30 31 if (argc != 2) 32 { 33 printf("Usage:n"); 34 printf("%s n", argv[0]); 35 return -1; 36 } 37 38 /*創建數據報套接字*/ 39 client_socket = socket(AF_INET, SOCK_DGRAM, 0); 40 if (client_socket == -1) 41 { 42 printf("socket error"); 43 return -1; 44 } 45 46 socket_server_addr.sin_family = AF_INET; 47 socket_server_addr.sin_port = htons(SERVER_PORT); 48 if (inet_aton(argv[1], &socket_server_addr.sin_addr) == 0) 49 { 50 printf("invalid server ipn"); 51 return -1; 52 } 53 memset(socket_server_addr.sin_zero, 0, 8); 54 55 ret = connect(client_socket, (const struct sockaddr *)&socket_server_addr, sizeof(struct sockaddr)); 56 if (ret == -1) 57 { 58 printf("connect error!n"); 59 return -1; 60 } 61 62 63 while (1) 64 { 65 if (fgets(buf, sizeof(buf), stdin)) 66 { 67 len = send(client_socket, buf, strlen(buf), 0); 68 if (len <= 0) 69 { 70 close(client_socket); 71 return -1; 72 } 73 } 74 } 75 76 close(client_socket); 77 return 0; 78} 79

在客戶端代碼2中,connect函數并非真的在協議層建立了連接,它只是指定了服務器的地址和端口號信息。

因為在connect中指定了服務器的地址和端口號信息,所以后面的send就可以直接發送了,而不用再次指定地址和端口號。

6.5.3 Makefile文件

all:server client_1 client_2 server:server.c gcc $^ -o $@ client_1:client_1.c gcc $^ -o $@ client_2:client_2.c gcc $^ -o $@ clean: rm server client_1 client_2 -f (注意:命令語句的開頭要用“Tab”鍵。)

6.5.4 執行

服務器端執行:

./server

客戶端執行:

./client_1 127.0.0.1

客戶端輸入:

good night

服務器端顯示:

Get Msg from 127.0.0.1 : good night

審核編輯 黃昊宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 網絡
    +關注

    關注

    14

    文章

    8264

    瀏覽量

    94714
  • 編程
    +關注

    關注

    90

    文章

    3716

    瀏覽量

    97182
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    【「Altium Designer 25 電路設計精進實踐」閱讀體驗】+本書概覽與內容特點介紹

    分也很具備工程實踐參考意義,屬于進階部分。 第四進行了線速設計介紹,一般做消費類產品好像很少遇到,汽車上可能會涉及到第五介紹了原理圖設計第六章介紹了PCB設計,拼版等都是具備工程實踐意義
    發表于 02-14 15:56

    分布式光伏”四可“,究竟是什么?

    《分布式光伏發電開發建設管理辦法(征求意見稿)》第六章運行管理第三十三條【調度運行】中也提到了“四可”問題。 程瑜 18 7 0211 2087 “四可”的相關政策有哪些? A:據不完全統計,目前,江蘇、陜西、江西、河南、安徽、山東等多個
    的頭像 發表于 01-13 16:26 ?219次閱讀
    分布式光伏”四可“,究竟是什么?

    【「高速數字設計(基礎篇)」閱讀體驗】第六章 去耦電容的容量需求分析

    去耦電容容量別瞎猜!《高速數字設計》第6教你量化計算,精準選型 在高速數字電路設計中,去耦電容選多大容量是個難點。《高速數字設計》第6“去耦電容的容量需求分析:知己知彼”,把這個問題進行了量化
    發表于 11-19 20:48

    【免費送書】成為硬核Linux開發者:《Linux 設備驅動開發(第 2 版)》

    Linux系統的設備驅動開發,一直給人門檻較高的印象,主要因內核機制抽象、需深度理解硬件原理、開發調試難度大所致。2021年,一本講解驅動開發的專著問世即獲市場青睞,暢銷近萬冊——這便
    的頭像 發表于 11-18 08:06 ?1394次閱讀
    【免費送書】成為硬核<b class='flag-5'>Linux</b><b class='flag-5'>開發</b>者:《<b class='flag-5'>Linux</b> 設備驅動<b class='flag-5'>開發</b>(第 2 版)》

    第六屆1024資管科技開發者大會(ITDC 2025)丨活動預告

    第六屆1024資管科技開發者大會(ITDC 2025)丨活動預告
    的頭像 發表于 10-15 18:39 ?461次閱讀
    <b class='flag-5'>第六</b>屆1024資管科技<b class='flag-5'>開發</b>者大會(ITDC 2025)丨活動預告

    RK3506開發Linux開發板極致性價比之選

    RK3506開發Linux開發板極致性價比之選瑞芯微RK3506開發板,3核Cortex-A7@1.5GHz+Cortex-M0,Linux
    的頭像 發表于 09-11 16:26 ?3453次閱讀
    RK3506<b class='flag-5'>開發</b>板<b class='flag-5'>Linux</b><b class='flag-5'>開發</b>板極致性價比之選

    Linux 應用開發手冊

    T507linux應用開發手冊
    發表于 08-22 17:01 ?15次下載

    第六章 W55MH32 UDP?Multicast示例

    本文介紹了在W55MH32芯片上實現UDP組播的原理、應用場景及回環測試方法,并通過實戰代碼展示了其具體實現過程。下一篇文章將聚焦DNS例程,講解其工作原理及實現方法,幫助大家更深入地理解網絡通信。敬請期待!
    的頭像 發表于 07-24 09:19 ?995次閱讀
    <b class='flag-5'>第六章</b> W55MH32 UDP?Multicast示例

    【「DeepSeek 核心技術揭秘」閱讀體驗】--全書概覽

    DeepSeek對人工智能技術格局的一個影響 第六章 DeepSeek開源技術剖析 第七 大模型發展未來展望 全書圖文并茂,對專業技術屬于進行了講解,也有對流程、框架、參數的展示,結合案例與應用方面的代入,是非常好的對DeepSeek較深入了解的書籍,后面與大家多多分享
    發表于 07-21 00:04

    電源設計中功率因數校正講解

    應用的四種不同實現方法中得到的結果的詳細分析。提供了按給定準則對各拓撲結構進行比較分析和排名。還包括根據以上章節描述的結果給設計師提供的指南。 第六章為以上章節中提出的拓撲提供了為滿足 FCC 關于
    發表于 06-25 15:58

    飛凌嵌入式ElfBoard ELF 1板卡-uboot移植之IOMUX介紹

    此文件夾,就自行創建),并解壓縮,準備進行移植。本章uboot移植工作基于eMMC版進行。 經過第六章,我們完整地移植了NXP的內核,相信大家對IOMUX已經很熟悉了,我們再簡單地提一下,如果您
    發表于 05-30 09:28

    第六章 外部中斷

    本章介紹W55MH32的IO口作為外部中斷輸入的使用。先闡述了NVIC(嵌套向量中斷控制器) 的結構、寄存器、優先級及相關函數,再說明EXTI(外部中斷和事件控制器)的功能。框圖及IO口與中斷線的映射。
    的頭像 發表于 05-26 16:27 ?1493次閱讀
    <b class='flag-5'>第六章</b> 外部中斷

    第六章 GPIO輸入——按鍵檢測

    本篇文章講述了如何在W55MH32上實現按鍵輸入檢測,以及按鍵輸入檢測的注意事項、實現方式和代碼講解等。掌握了按鍵檢測方式之后,我們就可以用按鍵控制我們想要實現的其他功能啦。
    的頭像 發表于 05-22 16:41 ?975次閱讀
    <b class='flag-5'>第六章</b> GPIO輸入——按鍵檢測

    [迅為]Linux開發小技巧:Remote - SSH插件

    [迅為]Linux開發小技巧:Remote - SSH插件
    的頭像 發表于 04-01 15:46 ?1161次閱讀
    [迅為]<b class='flag-5'>Linux</b><b class='flag-5'>開發</b>小技巧:Remote - SSH插件

    從零開始馴服Linux(一):ZYNQ-Linux啟動文件構建全解析

    hello.c就可以了。 創建Petalinux工程創建Petalinux工程的步驟在《領航者ZYNQ之嵌入式Linux開發指南》第六章Petalinux設計流程實戰中已講解,本章就不細述,也可直接
    發表于 03-20 16:48