Linux網絡編程概述

Linux網絡編程是在Linux操作系統環境下進行的網絡相關程序開發,主要用于實現不同計算機之間的數據通信和資源共享。以下從基礎知識、網絡編程模型、常用函數和編程步驟等方面進行詳細介紹:

基礎知識

1. 網絡協議

  • TCP/IP協議族:是互聯網通信的基礎協議,包括多個層次的協議。例如,IP協議負責網絡層的數據包傳輸,TCP和UDP協議則工作在傳輸層。

    • TCP(傳輸控制協議):提供面向連接、可靠的、基于字節流的傳輸服務。在進行數據傳輸前需要建立連接,傳輸完成后需要斷開連接,適合對數據準確性要求較高的場景,如文件傳輸、網頁瀏覽等。

    • UDP(用戶數據報協議):提供無連接、不可靠的傳輸服務。不需要建立連接,數據以數據報的形式發送,適合對實時性要求較高、對數據準確性要求相對較低的場景,如視頻會議、實時游戲等。

2. 網絡地址

  • IP地址:用于唯一標識網絡中的設備,分為IPv4和IPv6兩種。IPv4地址由32位二進制數組成,通常表示為點分十進制形式,如192.168.1.1;IPv6地址由128位二進制數組成,采用冒號分隔的十六進制表示。

  • 端口號:用于區分同一設備上不同的網絡應用程序,范圍從0到65535。其中,0 - 1023為系統保留端口,通常由系統服務使用,如HTTP服務默認使用80端口,HTTPS服務默認使用443端口。

網絡編程模型

1. 客戶端 - 服務器模型

  • 這是最常見的網絡編程模型,由客戶端和服務器兩部分組成。服務器監聽特定的端口,等待客戶端的連接請求;客戶端主動發起連接請求,與服務器建立連接后進行數據交互。

2. 多進程/多線程模型

  • 多進程模型:服務器為每個客戶端連接創建一個新的進程來處理,各個進程之間相互獨立,一個進程的崩潰不會影響其他進程。但創建和銷毀進程的開銷較大,會消耗較多的系統資源。

  • 多線程模型:服務器為每個客戶端連接創建一個新的線程來處理,線程共享進程的資源,創建和銷毀線程的開銷相對較小。但線程之間的同步和互斥問題需要處理,否則可能會出現數據不一致的情況。

3. I/O多路復用模型

  • 使用selectpollepoll等函數,讓一個進程可以同時監聽多個文件描述符(包括網絡套接字)的讀寫事件,當某個文件描述符有事件發生時,通知進程進行相應的處理。這種模型可以提高服務器的并發處理能力,減少系統資源的消耗。

常用函數

1. 套接字相關函數

  • socket():用于創建一個套接字,返回一個文件描述符。例如:

#include <sys/socket.h>
int sockfd = socket(AF_INET, SOCK_STREAM, 0);

其中,AF_INET表示使用IPv4地址族,SOCK_STREAM表示使用TCP協議。

  • bind():將套接字與指定的IP地址和端口號綁定。例如:

#include <arpa/inet.h>
struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = INADDR_ANY;
server_addr.sin_port = htons(8888);
bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr));
  • listen():將套接字設置為監聽狀態,等待客戶端的連接請求。例如:

listen(sockfd, 5);

其中,5表示允許的最大連接請求隊列長度。

  • accept():接受客戶端的連接請求,返回一個新的套接字描述符用于與客戶端進行通信。例如:

struct sockaddr_in client_addr;
socklen_t client_addr_len = sizeof(client_addr);
int connfd = accept(sockfd, (struct sockaddr *)&client_addr, &client_addr_len);
  • connect():客戶端使用該函數向服務器發起連接請求。例如:

struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
server_addr.sin_port = htons(8888);
connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr));

2. 數據讀寫函數

  • send()/recv():用于TCP套接字的數據發送和接收。例如:

// 發送數據
char *msg = "Hello, server!";
send(sockfd, msg, strlen(msg), 0);// 接收數據
char buffer[1024];
int n = recv(sockfd, buffer, sizeof(buffer), 0);
  • sendto()/recvfrom():用于UDP套接字的數據發送和接收,需要指定目標地址。例如:

// 發送數據
struct sockaddr_in server_addr;
// 初始化server_addr
sendto(sockfd, msg, strlen(msg), 0, (struct sockaddr *)&server_addr, sizeof(server_addr));// 接收數據
struct sockaddr_in client_addr;
socklen_t client_addr_len = sizeof(client_addr);
int n = recvfrom(sockfd, buffer, sizeof(buffer), 0, (struct sockaddr *)&client_addr, &client_addr_len);

編程步驟

1. 服務器端編程步驟

  1. 創建套接字(socket())。

  2. 綁定套接字到指定的IP地址和端口號(bind())。

  3. 將套接字設置為監聽狀態(listen())。

  4. 接受客戶端的連接請求(accept())。

  5. 與客戶端進行數據交互(send()/recv())。

  6. 關閉套接字(close())。

2. 客戶端編程步驟

  1. 創建套接字(socket())。

  2. 向服務器發起連接請求(connect())。

  3. 與服務器進行數據交互(send()/recv())。

  4. 關閉套接字(close())。

示例代碼

以下是一個簡單的TCP服務器和客戶端示例代碼:

服務器端代碼(server.c)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>#define PORT 8888int main() {int sockfd, connfd;struct sockaddr_in server_addr, client_addr;socklen_t client_addr_len = sizeof(client_addr);char buffer[1024];// 創建套接字sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd == -1) {perror("socket creation failed");exit(EXIT_FAILURE);}// 初始化服務器地址結構memset(&server_addr, 0, sizeof(server_addr));server_addr.sin_family = AF_INET;server_addr.sin_addr.s_addr = INADDR_ANY;server_addr.sin_port = htons(PORT);// 綁定套接字if (bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {perror("bind failed");exit(EXIT_FAILURE);}// 監聽套接字if (listen(sockfd, 5) == -1) {perror("listen failed");exit(EXIT_FAILURE);}printf("Server listening on port %d...\n", PORT);// 接受客戶端連接connfd = accept(sockfd, (struct sockaddr *)&client_addr, &client_addr_len);if (connfd == -1) {perror("accept failed");exit(EXIT_FAILURE);}printf("Client connected.\n");// 接收客戶端數據int n = recv(connfd, buffer, sizeof(buffer), 0);if (n == -1) {perror("recv failed");exit(EXIT_FAILURE);}buffer[n] = '\0';printf("Received from client: %s\n", buffer);// 發送響應數據char *msg = "Hello, client!";send(connfd, msg, strlen(msg), 0);// 關閉套接字close(connfd);close(sockfd);return 0;
}

客戶端代碼(client.c)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>#define SERVER_IP "127.0.0.1"
#define PORT 8888int main() {int sockfd;struct sockaddr_in server_addr;char buffer[1024];// 創建套接字sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd == -1) {perror("socket creation failed");exit(EXIT_FAILURE);}// 初始化服務器地址結構memset(&server_addr, 0, sizeof(server_addr));server_addr.sin_family = AF_INET;server_addr.sin_addr.s_addr = inet_addr(SERVER_IP);server_addr.sin_port = htons(PORT);// 連接服務器if (connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {perror("connect failed");exit(EXIT_FAILURE);}printf("Connected to server.\n");// 發送數據char *msg = "Hello, server!";send(sockfd, msg, strlen(msg), 0);// 接收服務器響應int n = recv(sockfd, buffer, sizeof(buffer), 0);if (n == -1) {perror("recv failed");exit(EXIT_FAILURE);}buffer[n] = '\0';printf("Received from server: %s\n", buffer);// 關閉套接字close(sockfd);return 0;
}

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

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

相關文章

Linux內核perf性能分析工具案例分析

一、系統級性能分析工具perf原理 1. perf 的基本概念 內核集成&#xff1a;perf 直接集成在 Linux 內核源碼中&#xff0c;能夠深度訪問硬件和操作系統層面的性能數據&#xff0c;具有低開銷、高精度的特點。 事件采樣原理&#xff1a;通過定期采樣系統事件&#xff0…

word-spacing 屬性

介紹 CSS word-spacing 屬性&#xff0c;用于指定段字之間的空間&#xff0c;例如&#xff1a; p {word-spacing:30px; }word-spacing屬性增加或減少字與字之間的空白。 注意&#xff1a; 負值是允許的。 瀏覽器支持 表格中的數字表示支持該屬性的第一個瀏覽器版本號。 屬…

5種特效融合愚人節搞怪病毒

內容供學習使用,不得轉賣,代碼復制后請1小時內刪除,此代碼會危害計算機安全,謹慎操作 并在虛擬機里運行此代碼!&#xff0c;病毒帶來后果自負! #include <windows.h> #include <cmath> #include <thread> using namespace std; // 屏幕特效函數聲明 void In…

深入理解 Windows 進程管理:taskkill 命令詳解

引言 在 Windows 系統開發和日常使用中&#xff0c;我們經常會遇到程序卡死、文件被占用導致無法編譯等問題。這時&#xff0c;taskkill 命令就成了解決問題的利器。本文將詳細介紹 taskkill 的使用方法、常見場景以及注意事項&#xff0c;幫助你高效管理系統進程。 1. 什么是…

【C++】右值引用與完美轉發

目錄 一、右值引用&#xff1a; 1、左值與右值&#xff1a; 2、左值引用和右值引用&#xff1a; 二、右值引用的使用場景&#xff1a; 1、左值引用的使用場景&#xff1a; 2、右值引用的使用場景&#xff1a; 移動構造 移動賦值 三、完美轉發&#xff1a; 1、萬能引用…

wx201基于ssm+vue+uniapp的購物系統設計與實現小程序

開發語言&#xff1a;Java框架&#xff1a;ssmuniappJDK版本&#xff1a;JDK1.8服務器&#xff1a;tomcat7數據庫&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;數據庫工具&#xff1a;Navicat11開發軟件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;M…

Mac 常用命令

一、文件操作(必知必會)? ?1. 快速導航 cd ~/Documents # 進入文檔目錄 cd .. # 返回上級目錄 pwd # 顯示當前路徑 2. ?文件管理 touch new_file.txt # 創建空文件 mkdir -p project/{src,docs} # 遞歸創建目錄 cp …

Nginx RTMP 處理模塊 (ngx_rtmp_handler.c) 詳細分析

ngx_rtmp_handler 是 Nginx RTMP 模塊中的核心處理部分&#xff0c;主要負責處理 RTMP 流會話中的數據接收、發送、ping 操作以及分塊大小的設置等。 1. 全局變量 ngx_rtmp_naccepted: 記錄接受的 RTMP 連接數。 ngx_rtmp_bw_out 和 ngx_rtmp_bw_in: 分別表示輸出帶寬和輸入帶…

(二)萬字長文解析:deepResearch如何用更長的思考時間換取更高質量的回復?各家產品對比深度詳解

DeepResearch的研究背景 業務背景&#xff1a;用更長的等待時間&#xff0c;換取更高質量、更具實用性的結果 當前AI技術發展正經歷從“即時響應”到“深度思考”的范式轉變。用戶對延遲的容忍度顯著提升&#xff0c;從傳統200ms的交互響應放寬至數秒甚至數分鐘&#xff0c;以…

綜述速讀|086.04.24.Retrieval-Augmented Generation for AI-Generated Content A Survey

論文題目&#xff1a;Retrieval-Augmented Generation for AI-Generated Content: A Survey 論文地址&#xff1a;https://arxiv.org/abs/2402.19473 bib引用&#xff1a; misc{zhao2024retrievalaugmentedgenerationaigeneratedcontent,title{Retrieval-Augmented Generation…

Spring Cache:簡化緩存管理的抽象框架

Spring Cache Spring Cache是Spring框架提供的緩存抽象層&#xff0c;通過注解和自動化配置&#xff0c;簡化應用中對緩存的操作&#xff0c;支持多種緩存實現&#xff08;如Redis、Ehcache、Caffeine&#xff09;。 1. 核心特性 聲明式緩存&#xff1a;通過注解&#xff08;…

求矩陣某列的和

設計函數sum_column( int A[E1(n)][E2(n)], int j )&#xff0c;E1(n)和E2(n)分別為用宏定義的行數和列數&#xff0c;j為列號。在該函數中&#xff0c;設計指針ptr&A[0][j]&#xff0c;通過*ptr及ptrptrE2(n)訪問第j列元素&#xff0c;從而求得第j列元素的和。在主函數中定…

IM騰訊Trtc與vod云點播:實現合流錄制并上傳,根據參數返回視頻地址

全文目錄,一步到位 1.前言簡介1.1 專欄傳送門1.1.1 文檔傳送門 2. java基礎使用2.1 準備工作2.1.1 云控制臺獲取(密鑰和密鑰secret)2.1.2 找到trtc控制臺2.1.3 vod云點播控制臺 2.2 使用準備的數據進行操作2.2.0 引入依賴2.2.1 創建TrtcUtils工具類2.2.2 TrtcReqDTO 錄制請求dt…

藍橋杯 數三角

問題描述 小明在二維坐標系中放置了 n 個點&#xff0c;他想從中選出一個包含三個點的子集&#xff0c;使得這三個點能夠組成一個三角形。 由于這樣的方案太多了&#xff0c;他決定只選擇那些可以組成等腰三角形的方案。 請幫他計算出一共有多少種選法可以組成等腰三角形。 …

【Kafka】從理論到實踐的深度解析

在當今數字化轉型的時代&#xff0c;企業面臨著數據量呈指數級增長、業務系統愈發復雜的挑戰。在這樣的背景下&#xff0c;高效的數據傳輸與處理技術成為了關鍵。Kafka&#xff0c;作為一款分布式消息隊列系統&#xff0c;憑借其卓越的性能和豐富的特性&#xff0c;在眾多企業的…

Linux課程學習一

一.fopen與fclose函數 linux中fopen函數直接用man fopen 去查看 函數原型 FILE * fopen(constchar *path , cost char *mode) /* * description : 打開一個文件 * param ‐ path : 指定文件路徑,如&#xff1a;"./test.txt"&#xff0c;也可以直接由文件名 * param …

【區塊鏈安全 | 第十篇】智能合約概述

部分內容與前文互補。 文章目錄 一個簡單的智能合約子貨幣&#xff08;Subcurrency&#xff09;示例區塊鏈基礎交易區塊預編譯合約 一個簡單的智能合約 我們從一個基礎示例開始&#xff0c;該示例用于設置變量的值&#xff0c;并允許其他合約訪問它。 // SPDX-License-Identi…

XML標簽格式轉換為YOLO TXT格式

針對的是多邊形&#xff08;<polygon>&#xff09;來描述對象的邊界&#xff0c;而不是傳統的矩形框&#xff08;<bndbox>&#xff09; import xml.etree.ElementTree as ET import os from pathlib import Path# 解析VOC格式的XML文件&#xff0c;提取目標框的標…

大唐杯02 DTM.PX4.016

01 5G關鍵技術概述 回傳壓力大&#xff1a;核心網向基站回傳壓力大 02 5G關鍵技術介紹01

CSS3學習教程,從入門到精通, CSS3 盒子模型的詳細語法知識點及案例代碼(23)

CSS3 盒子模型的詳細語法知識點及案例代碼 CSS3 盒子模型完整指南 一、盒子模型基礎 每個 HTML 元素都被視為一個矩形盒子&#xff0c;由以下部分組成&#xff1a; 內容區 (Content)內邊距 (Padding)邊框 (Border)外邊距 (Margin) 二、語法知識點詳解 1. 盒子的寬和高 sel…