編程與數學 03-002 計算機網絡 16_網絡編程基礎

編程與數學 03-002 計算機網絡 16_網絡編程基礎

    • 一、網絡編程的基本概念
      • (一)客戶端與服務器模型
      • (二)套接字(Socket)編程的基本原理
    • 二、基于TCP的網絡編程
      • (一)TCP套接字的創建與使用
      • (二)示例程序(如簡單的聊天程序)
    • 三、基于UDP的網絡編程
      • (一)UDP套接字的創建與使用
      • (二)UDP編程的特點與應用場景
    • 四、總結

摘要:本文是計算機網絡課程中關于網絡編程基礎的學習筆記。網絡編程涵蓋客戶端與服務器模型、套接字編程、基于TCP和UDP的網絡編程。客戶端與服務器模型是常見網絡應用架構,客戶端請求服務,服務器提供服務。套接字是網絡編程基礎,用于實現通信,分為流式、數據報和原始套接字。基于TCP的編程提供可靠連接服務,基于UDP的編程提供無連接服務,適用于實時應用。通過學習這些內容,可深入理解網絡編程概念和方法,為網絡應用開發打下基礎。

關鍵詞:網絡編程、客戶端與服務器、套接字、TCP、UDP、實時應用

人工智能助手:Kimi


一、網絡編程的基本概念

(一)客戶端與服務器模型

  1. 定義

    • 客戶端與服務器模型是一種常見的網絡應用架構,其中客戶端是請求服務的一方,服務器是提供服務的一方。客戶端通過網絡向服務器發送請求,服務器處理請求后返回響應。
  2. 特點

    • 客戶端:客戶端是用戶使用的應用程序,如Web瀏覽器、郵件客戶端等。客戶端的主要功能是向服務器發送請求,并接收服務器的響應。
    • 服務器:服務器是提供服務的計算機,如Web服務器、郵件服務器等。服務器的主要功能是接收客戶端的請求,并處理請求后返回響應。
    • 通信方式:客戶端與服務器之間的通信通常通過套接字(Socket)進行,套接字是網絡編程中的基本概念,用于實現網絡通信。

(二)套接字(Socket)編程的基本原理

  1. 定義

    • 套接字(Socket)是網絡編程中的基本概念,用于實現網絡通信。套接字提供了一種抽象的接口,使得應用程序可以通過套接字進行網絡通信。
  2. 類型

    • 流式套接字(SOCK_STREAM):流式套接字用于TCP協議,提供可靠的、面向連接的通信服務。
    • 數據報套接字(SOCK_DGRAM):數據報套接字用于UDP協議,提供不可靠的、無連接的通信服務。
    • 原始套接字(SOCK_RAW):原始套接字用于直接訪問網絡層協議,如IP協議。原始套接字通常用于網絡協議的開發和調試。
  3. 工作過程

    • 創建套接字:通過調用socket()函數創建套接字。
    • 綁定地址:通過調用bind()函數將套接字綁定到一個地址和端口。
    • 監聽連接:對于TCP套接字,通過調用listen()函數監聽連接請求。
    • 接受連接:對于TCP套接字,通過調用accept()函數接受連接請求。
    • 發送和接收數據:通過調用send()recv()函數發送和接收數據。
    • 關閉套接字:通過調用close()函數關閉套接字。

二、基于TCP的網絡編程

(一)TCP套接字的創建與使用

  1. 創建TCP套接字

    • 通過調用socket()函數創建TCP套接字:
      int sockfd = socket(AF_INET, SOCK_STREAM, 0);
      
      其中,AF_INET表示使用IPv4地址族,SOCK_STREAM表示使用TCP協議。
  2. 綁定地址

    • 通過調用bind()函數將套接字綁定到一個地址和端口:
      struct sockaddr_in addr;
      addr.sin_family = AF_INET;
      addr.sin_port = htons(port);
      addr.sin_addr.s_addr = INADDR_ANY;
      bind(sockfd, (struct sockaddr *)&addr, sizeof(addr));
      
      其中,port是服務器的端口號,INADDR_ANY表示綁定到所有可用的網絡接口。
  3. 監聽連接

    • 通過調用listen()函數監聽連接請求:
      listen(sockfd, backlog);
      
      其中,backlog是未完成連接隊列的最大長度。
  4. 接受連接

    • 通過調用accept()函數接受連接請求:
      int clientfd = accept(sockfd, (struct sockaddr *)&client_addr, &client_len);
      
      其中,clientfd是接受連接后返回的客戶端套接字,client_addr是客戶端的地址信息,client_len是客戶端地址信息的長度。
  5. 發送和接收數據

    • 通過調用send()recv()函數發送和接收數據:
      send(clientfd, data, size, 0);
      recv(clientfd, buffer, size, 0);
      
      其中,data是要發送的數據,size是數據的大小,buffer是接收數據的緩沖區。
  6. 關閉套接字

    • 通過調用close()函數關閉套接字:
      close(sockfd);
      close(clientfd);
      

(二)示例程序(如簡單的聊天程序)

  1. 服務器端代碼

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include <arpa/inet.h>int main() {int sockfd, clientfd;struct sockaddr_in server_addr, client_addr;socklen_t client_len;char buffer[1024];// 創建TCP套接字sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd < 0) {perror("socket");exit(1);}// 綁定地址server_addr.sin_family = AF_INET;server_addr.sin_port = htons(8080);server_addr.sin_addr.s_addr = INADDR_ANY;if (bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {perror("bind");close(sockfd);exit(1);}// 監聽連接if (listen(sockfd, 5) < 0) {perror("listen");close(sockfd);exit(1);}printf("Server is listening on port 8080...\n");// 接受連接client_len = sizeof(client_addr);clientfd = accept(sockfd, (struct sockaddr *)&client_addr, &client_len);if (clientfd < 0) {perror("accept");close(sockfd);exit(1);}printf("Client connected: %s:%d\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));// 通信循環while (1) {// 接收客戶端數據int n = recv(clientfd, buffer, sizeof(buffer), 0);if (n < 0) {perror("recv");break;} else if (n == 0) {printf("Client disconnected\n");break;}buffer[n] = '\0';printf("Received from client: %s\n", buffer);// 發送數據到客戶端send(clientfd, buffer, strlen(buffer), 0);}// 關閉套接字close(clientfd);close(sockfd);return 0;
    }
    
  2. 客戶端代碼

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include <arpa/inet.h>int main() {int sockfd;struct sockaddr_in server_addr;char buffer[1024];// 創建TCP套接字sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd < 0) {perror("socket");exit(1);}// 設置服務器地址server_addr.sin_family = AF_INET;server_addr.sin_port = htons(8080);inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr);// 連接到服務器if (connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {perror("connect");close(sockfd);exit(1);}printf("Connected to server at 127.0.0.1:8080\n");// 通信循環while (1) {// 從用戶輸入數據printf("Enter message: ");fgets(buffer, sizeof(buffer), stdin);buffer[strcspn(buffer, "\n")] = '\0';// 發送數據到服務器send(sockfd, buffer, strlen(buffer), 0);// 接收服務器響應int n = recv(sockfd, buffer, sizeof(buffer), 0);if (n < 0) {perror("recv");break;} else if (n == 0) {printf("Server disconnected\n");break;}buffer[n] = '\0';printf("Received from server: %s\n", buffer);}// 關閉套接字close(sockfd);return 0;
    }
    

三、基于UDP的網絡編程

(一)UDP套接字的創建與使用

  1. 創建UDP套接字

    • 通過調用socket()函數創建UDP套接字:
      int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
      
      其中,AF_INET表示使用IPv4地址族,SOCK_DGRAM表示使用UDP協議。
  2. 綁定地址

    • 通過調用bind()函數將套接字綁定到一個地址和端口:
      struct sockaddr_in addr;
      addr.sin_family = AF_INET;
      addr.sin_port = htons(port);
      addr.sin_addr.s_addr = INADDR_ANY;
      bind(sockfd, (struct sockaddr *)&addr, sizeof(addr));
      
      其中,port是服務器的端口號,INADDR_ANY表示綁定到所有可用的網絡接口。
  3. 發送和接收數據

    • 通過調用sendto()recvfrom()函數發送和接收數據:
      sendto(sockfd, data, size, 0, (struct sockaddr *)&server_addr, sizeof(server_addr));
      recvfrom(sockfd, buffer, size, 0, (struct sockaddr *)&client_addr, &client_len);
      
      其中,data是要發送的數據,size是數據的大小,buffer是接收數據的緩沖區,server_addr是服務器的地址信息,client_addr是客戶端的地址信息,client_len是客戶端地址信息的長度。
  4. 關閉套接字

    • 通過調用close()函數關閉套接字:
      close(sockfd);
      

(二)UDP編程的特點與應用場景

  1. 特點

    • 無連接:UDP協議是無連接的,發送方在發送數據前不需要建立連接,接收方在接收數據前也不需要建立連接。這使得UDP協議的開銷較小,適合對實時性要求較高的應用。
    • 不可靠:UDP協議不提供可靠傳輸機制,不保證數據的正確傳輸。如果數據在傳輸過程中丟失或出錯,UDP協議不會進行重傳。
    • 簡單:UDP協議的實現相對簡單,協議開銷較小,適合對實時性要求較高的應用,如視頻會議、音頻廣播等。
    • 支持多播:UDP協議支持多播通信,可以向多個目標地址同時發送數據。
  2. 應用場景

    • 實時應用:UDP協議適合對實時性要求較高的應用,如視頻會議、音頻廣播等。這些應用對數據的實時性要求較高,允許一定程度的數據丟失。
    • 簡單應用:UDP協議適合實現簡單的網絡應用,如DNS查詢、SNMP等。這些應用對協議的開銷要求較低,不需要復雜的可靠傳輸機制。
    • 多播應用:UDP協議支持多播通信,適合向多個目標地址同時發送數據的應用,如多播視頻會議、多播音頻廣播等。

四、總結

網絡編程是計算機網絡中的重要組成部分,涉及客戶端與服務器模型、套接字編程、基于TCP的網絡編程和基于UDP的網絡編程等多個方面。客戶端與服務器模型是一種常見的網絡應用架構,客戶端通過網絡向服務器發送請求,服務器處理請求后返回響應。套接字是網絡編程中的基本概念,用于實現網絡通信。基于TCP的網絡編程通過創建TCP套接字,實現可靠的、面向連接的通信服務;基于UDP的網絡編程通過創建UDP套接字,實現不可靠的、無連接的通信服務。

通過學習網絡編程的基礎知識,我們可以更好地理解網絡編程的基本概念和實現方法,為后續的網絡應用開發打下堅實的基礎。

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

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

相關文章

在純servlet項目中,使用@WebFilter定義了多個filter,如何設置filter的優先級

在純 Servlet 項目中&#xff0c;WebFilter 注解本身并不提供直接的屬性來設置過濾器的優先級&#xff08;如過濾器執行的順序&#xff09;。但是&#xff0c;你可以通過以下幾種方式來控制過濾器的執行順序&#xff1a;1. 通過 web.xml 配置過濾器的順序在 web.xml 中&#xf…

關于鴉片戰爭的歷史

19世紀&#xff0c;英國東印度公司獲得了鴉片貿易的壟斷權&#xff0c;而猶太人是東印度公司的主要投資人之一&#xff0c;英國東印度公司又將鴉片經營權外包給了猶太人。其中&#xff0c;塞法迪猶太人控制了主要的鴉片交易&#xff0c;著名的沙遜家族就是當時臭名昭著的猶太鴉…

Maven - 并行安全無重復打包構建原理揭秘

作者&#xff1a;唐叔在學習 專欄&#xff1a;唐叔的Java實踐 標簽&#xff1a; #Maven并行構建 #Maven多線程打包 #Java構建優化 #Maven性能調優 #CI/CD加速 #Maven反應堆原理 #避免重復編譯 #高并發構建 文章目錄一、遇到問題&#xff1a;并行打包會不會翻車&#xff1f;二、…

phpyun人才系統v7.1使用升級補丁怎么從授權版升級至vip版?我說下我的技巧有資源的可以看過來,這樣就不用花錢麻煩官方了,新版本照樣支持小程序源碼

前:這個方法我只在Phpyun 的7.x系列使用過&#xff0c;低于這個版本的我暫時沒有研究過&#xff0c;我感覺大同小異&#xff01; 一. 升級前提條件 無論現在你使用的是商業版還是學習版 想垮系列升級你必須有對應的升級補丁&#xff0c;比如說你是授權版或旗艦版 想升級到最新的…

P13014 [GESP202506 五級] 最大公因數

題目描述對于兩個正整數 a,b&#xff0c;他們的最大公因數記為 gcd(a,b)。對于 k>3 個正整數 c1?,c2?,…,ck?&#xff0c;他們的最大公因數為&#xff1a;gcd(c1?,c2?,…,ck?)gcd(gcd(c1?,c2?,…,ck?1?),ck?)給定 n 個正整數 a1?,a2?,…,an? 以及 q 組詢問。對…

【機器學習-4】 | 集成學習 / 隨機森林篇

集成學習與隨機森林學習筆記 0 序言 本文將系統介紹Bagging、Boosting兩種集成學習方法及隨機森林算法&#xff0c;涵蓋其原理、過程、參數等內容。通過學習&#xff0c;你能理解兩種方法的區別&#xff0c;掌握隨機森林的隨機含義、算法步驟、優點及關鍵參數使用&#xff0c;明…

深入 Go 底層原理(十二):map 的實現與哈希沖突

1. 引言map 是 Go 語言中使用頻率極高的數據結構&#xff0c;它提供了快速的鍵值對存取能力。雖然 map 的使用非常簡單&#xff0c;但其底層的實現卻是一個精心設計的哈希表&#xff0c;它需要高效地處理哈希計算、數據存儲、擴容以及最關鍵的——哈希沖突。本文將解剖 map 的底…

Reinforcing General Reasoning without Verifiers

1.概述 DeepSeek-R1-Zero [10] 最近展示了使用可驗證獎勵的強化學習(RL)訓練大型語言模型(LLMs)可以極大地提高推理能力。在這個可驗證獎勵的強化學習(RLVR)框架 [17] 中,LLM 生成一個推理過程(即,思維鏈,CoT),然后給出最終答案。一個基于規則的程序隨后提取并評估…

Hyperbrowser MCP:重新定義網頁抓取與瀏覽器自動化的AI驅動工具

在數據驅動的時代,網頁內容的高效處理和自動化操作成為開發者和企業關注的焦點。Hyperbrowser MCP(Model Context Protocol Server)作為一款革命性的工具,通過AI與瀏覽器技術的深度融合,為網頁抓取、結構化數據提取和瀏覽器自動化提供了全新的解決方案。無論你是需要從復雜…

關于Web前端安全防御XSS攻防的幾點考慮

作為一位前端老鳥&#xff0c;總結一下web前端安全領域基礎概念、防御策略、框架實踐及新興技術等幾個維度的考慮。一、基礎概念與核心漏洞1.XSS 攻擊XSS&#xff08;跨站腳本攻擊&#xff09;是 Web 前端安全中最常見的威脅之一&#xff0c;其核心是攻擊者將惡意腳本注入到網頁…

eSIM技術深度解析:從物理芯片到數字革命

當蘋果公司在2018年首次在iPhone XS系列中引入eSIM技術時&#xff0c;許多用戶可能并未意識到這個看似微小的改變將帶來怎樣的技術革命。從1991年第一張信用卡大小的SIM卡&#xff0c;到今天僅有5mm x 5mm的eSIM芯片&#xff0c;這不僅僅是尺寸的縮小&#xff0c;更是移動通信技…

通俗易懂解釋Java8 HashMap

我們來用通俗易懂的方式解釋一下 Java 8 中 HashMap 的原理&#xff0c;讓你對它的結構、運行機制有清晰的理解。&#x1f333; 什么是 HashMap&#xff1f; HashMap 是 Java 中非常常用的數據結構&#xff0c;用于存儲鍵值對&#xff08;key-value&#xff09;。你可以把它理解…

macOS安裝配置Unbound DNS完整指南

文章目錄macOS安裝配置Unbound DNS完整指南&#x1f3af; 為什么選擇Unbound&#xff1f;&#x1f4cb; 系統要求&#x1f680; 安裝步驟1. 使用Homebrew安裝2. 查看安裝信息?? 基礎配置1. 備份默認配置2. 創建基礎配置文件3. 基礎配置內容配置53端口版本&#xff08;高級用戶…

學習模板元編程(2)std::true_type/false_type

目錄 實現原理 應用場景 條件編譯 通過特化和繼承&#xff0c;實現std::is_xxx系列 思路 舉例 例子1&#xff0c;is_bool 例子2&#xff0c;is_ptr 實現原理 std::true_type/false_type是模板intergral_constant的兩種實現&#xff1a; using true_type integral_co…

Chain-of-Thought Prompting Elicits Reasoning in Large Language Models論文閱讀筆記

Chain-of-Thought Prompting Elicits Reasoning in Large Language Models 摘要 本文探索了思維鏈&#xff08;chain of thought&#xff09;&#xff0c;即一系列中間推理過程&#xff0c;可以有效地增強大語言模型的復雜推理能力。 在三個大型語言模型上的實驗表明&#xff0…

華為核心交換機S7700的內存OID

華為S7700系列交換機 SNMP內存相關OID說明 以下列出了華為S7700核心交換機在SNMP v2c下可用的內存相關OID,包括CPU內存利用率、物理內存總量、已用內存和空閑內存,并給出每個OID的功能描述、數據類型、單位、使用說明等信息。 1. CPU內存利用率(處理器內存占用百分比) OID名…

中州養老Day02:服務管理護理計劃模塊

本日任務:服務管理的后端開發 1.學習:護理項目 (1)評估開發工期的思路和注意事項 全面熟悉項目,了解項目重點,設置開發優先級 比如,在下面圖片的接口文檔中版本有1.0,2.0,3.0也就是功能的初代,二代,三代,所以我們在大致瀏覽所有功能后,要優先關注初代功能的實現 開發計劃 …

JavaScript:Ajax(異步通信技術)

一、Ajax 核心概念Ajax&#xff08;Asynchronous JavaScript and XML&#xff09;是一種異步通信技術&#xff0c;核心特點&#xff1a;無刷新更新&#xff1a;無需重新加載整個頁面異步處理&#xff1a;后臺發送/接收數據不阻塞用戶數據格式&#xff1a;支持 XML/JSON/HTML/純…

leetcode 118. 楊輝三角 簡單

給定一個非負整數 numRows&#xff0c;生成「楊輝三角」的前 numRows 行。在「楊輝三角」中&#xff0c;每個數是它左上方和右上方的數的和。示例 1:輸入: numRows 5 輸出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]示例 2:輸入: numRows 1 輸出: [[1]]提示:1 < numRows…

jmeter--While控制器--循環直到接口響應符合條件

場景描述業務場景&#xff1a;單據計算接口情況&#xff1a;單據計算&#xff0c;調用接口1發起計算&#xff0c;接口2查詢計算執行結果jmeter腳本&#xff1a;把接口1和接口2&#xff08;接口2循環調用&#xff0c;直到返回執行完成狀態&#xff09;添加到一個事務&#xff0c…