TCP/IP-——C++編程詳解

1. TCP/IP 編程基本概念

  • TCP(傳輸控制協議):面向連接、可靠的傳輸層協議,保證數據順序和完整性。
  • IP(網際協議):負責將數據包路由到目標地址。
  • Socket(套接字):網絡通信的端點,通過IP和端口標識。

2. 服務器端實現步驟

步驟 1:創建套接字
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <cstring>
#include <iostream>int main() {// 創建套接字int server_fd = socket(AF_INET, SOCK_STREAM, 0);if (server_fd == -1) {std::cerr << "Socket creation failed\n";return -1;}
步驟 2:綁定套接字到地址和端口
    // 設置地址結構struct sockaddr_in address;address.sin_family = AF_INET;          // IPv4address.sin_addr.s_addr = INADDR_ANY;  // 綁定所有接口address.sin_port = htons(8080);        // 端口號(需轉為網絡字節序)// 綁定套接字if (bind(server_fd, (struct sockaddr*)&address, sizeof(address)) < 0) {std::cerr << "Bind failed\n";return -1;}
步驟 3:監聽連接請求
    // 監聽,隊列長度設為5if (listen(server_fd, 5) < 0) {std::cerr << "Listen failed\n";return -1;}std::cout << "Server listening on port 8080...\n";
步驟 4:接受客戶端連接
    // 接受連接int addrlen = sizeof(address);int new_socket = accept(server_fd, (struct sockaddr*)&address, (socklen_t*)&addrlen);if (new_socket < 0) {std::cerr << "Accept failed\n";return -1;}std::cout << "Client connected\n";
步驟 5:接收和發送數據
    // 接收數據char buffer[1024] = {0};int valread = read(new_socket, buffer, 1024);std::cout << "Received: " << buffer << std::endl;// 發送響應const char* response = "Hello from server";send(new_socket, response, strlen(response), 0);std::cout << "Response sent\n";
步驟 6:關閉套接字
    close(new_socket);close(server_fd);return 0;
}

3. 客戶端實現步驟

步驟 1:創建套接字
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <cstring>
#include <iostream>int main() {// 創建套接字int sock = socket(AF_INET, SOCK_STREAM, 0);if (sock == -1) {std::cerr << "Socket creation failed\n";return -1;}
步驟 2:設置服務器地址
    struct sockaddr_in serv_addr;serv_addr.sin_family = AF_INET;serv_addr.sin_port = htons(8080);  // 服務器端口// 將IP地址從字符串轉為二進制格式if (inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) <= 0) {std::cerr << "Invalid address\n";return -1;}
步驟 3:連接到服務器
    if (connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) < 0) {std::cerr << "Connection failed\n";return -1;}std::cout << "Connected to server\n";
步驟 4:發送和接收數據
    // 發送數據const char* message = "Hello from client";send(sock, message, strlen(message), 0);std::cout << "Message sent\n";// 接收響應char buffer[1024] = {0};int valread = read(sock, buffer, 1024);std::cout << "Server response: " << buffer << std::endl;
步驟 5:關閉套接字
    close(sock);return 0;
}

4. 關鍵函數和結構體

  • socket(): 創建套接字。
  • bind(): 綁定套接字到地址和端口。
  • listen(): 進入監聽狀態。
  • accept(): 接受客戶端連接。
  • connect(): 客戶端連接到服務器。
  • send()/recv()write()/read(): 發送和接收數據。
  • sockaddr_in: 存儲地址信息的結構體(IPv4)。

5. 注意事項

  1. 錯誤處理:每次調用網絡函數后檢查返回值。
  2. 字節序轉換
    • htons(): 主機字節序轉網絡字節序(端口)。
    • inet_pton(): 字符串IP轉二進制。
  3. 資源釋放:使用 close() 關閉套接字。
  4. 端口復用:通過 setsockopt() 設置 SO_REUSEADDR 選項。

6. 完整示例代碼

  • 服務器端

    #include <iostream>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <unistd.h>
    #include <string.h>int main() {int server_fd, new_socket;struct sockaddr_in address;int addrlen = sizeof(address);char buffer[1024] = {0};const char* hello = "Hello from server";// 創建socketif ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {perror("socket failed");exit(EXIT_FAILURE);}// 綁定socketaddress.sin_family = AF_INET;address.sin_addr.s_addr = INADDR_ANY;address.sin_port = htons(8080);if (bind(server_fd, (struct sockaddr*)&address, sizeof(address)) < 0) {perror("bind failed");exit(EXIT_FAILURE);}// 監聽socketif (listen(server_fd, 3) < 0) {perror("listen");exit(EXIT_FAILURE);}// 接受連接if ((new_socket = accept(server_fd, (struct sockaddr*)&address, (socklen_t*)&addrlen)) < 0) {perror("accept");exit(EXIT_FAILURE);}// 讀取客戶端發送的數據read(new_socket, buffer, 1024);std::cout << "Message from client: " << buffer << std::endl;// 向客戶端發送數據send(new_socket, hello, strlen(hello), 0);std::cout << "Hello message sent\n";// 關閉socketclose(new_socket);close(server_fd);return 0;
    }
    #include <iostream>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <unistd.h>
    #include <string.h>int main() {int server_fd, new_socket;struct sockaddr_in address;int addrlen = sizeof(address);char buffer[1024] = {0};const char* hello = "Hello from server";// 創建socketif ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {perror("socket failed");exit(EXIT_FAILURE);}// 綁定socketaddress.sin_family = AF_INET;address.sin_addr.s_addr = INADDR_ANY;address.sin_port = htons(8080);if (bind(server_fd, (struct sockaddr*)&address, sizeof(address)) < 0) {perror("bind failed");exit(EXIT_FAILURE);}// 監聽socketif (listen(server_fd, 3) < 0) {perror("listen");exit(EXIT_FAILURE);}// 接受連接if ((new_socket = accept(server_fd, (struct sockaddr*)&address, (socklen_t*)&addrlen)) < 0) {perror("accept");exit(EXIT_FAILURE);}// 讀取客戶端發送的數據read(new_socket, buffer, 1024);std::cout << "Message from client: " << buffer << std::endl;// 向客戶端發送數據send(new_socket, hello, strlen(hello), 0);std::cout << "Hello message sent\n";// 關閉socketclose(new_socket);close(server_fd);return 0;
    }
  • 客戶端

    #include <iostream>
    #include <sys/socket.h>
    #include <arpa/inet.h>
    #include <unistd.h>
    #include <string.h>int main() {int sock = 0;struct sockaddr_in serv_addr;char buffer[1024] = {0};const char* hello = "Hello from client";// 創建socketif ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {std::cerr << "Socket creation error" << std::endl;return -1;}// 設置服務器地址serv_addr.sin_family = AF_INET;serv_addr.sin_port = htons(8080);// 將IP地址從字符串轉換為網絡格式if (inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) <= 0) {std::cerr << "Invalid address/Address not supported" << std::endl;return -1;}// 連接到服務器if (connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) < 0) {std::cerr << "Connection Failed" << std::endl;return -1;}// 向服務器發送數據send(sock, hello, strlen(hello), 0);std::cout << "Hello message sent" << std::endl;// 讀取服務器發送的數據read(sock, buffer, 1024);std::cout << "Message from server: " << buffer << std::endl;// 關閉socketclose(sock);return 0;
    }
    

編譯運行:

# 編譯服務器
g++ server.cpp -o server
# 編譯客戶端
g++ client.cpp -o client# 啟動服務器
./server
# 啟動客戶端(另起終端)
./client

對于更復雜的場景(如多客戶端并發),需結合多線程或異步I/O(如 select/epoll)進行擴展。

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

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

相關文章

Python圖像處理基礎(三)

Python圖像處理基礎(三) 文章目錄 Python圖像處理基礎(三)2、計算機色彩(Computer Color)2.5 色彩分辨率2.6 灰度顏色模型2.7 CMYK 顏色模型2.7.1 K 部分2.8 HSL/HSB 顏色模型2、計算機色彩(Computer Color) 2.5 色彩分辨率 人眼可以看到許多不同的顏色,但我們的感知…

Vue路由深度解析:Vue Router與導航守衛

Vue路由深度解析&#xff1a;Vue Router與導航守衛 一、Vue Router基礎與安裝配置 1. Vue Router核心概念 Vue Router是Vue.js官方的路由管理器&#xff0c;主要功能包括&#xff1a; 嵌套路由映射模塊化的路由配置路由參數、查詢、通配符細粒度的導航控制自動激活的CSS類鏈…

前后端分離微服務架構

前后端分離微服務架構 介紹: 前端通過Vue和ElementUI構建界面&#xff0c;使用axios調用后端API。Nginx作為反向代理&#xff0c;將請求路由到Zuul網關。Zuul進行權限驗證&#xff08;JWT&#xff09;后&#xff0c;將請求分發到微服務。(身份驗證,安全防護(sql注入,xxs跨網站…

iOS 工廠模式

iOS 工廠模式 文章目錄 iOS 工廠模式前言工廠模式簡單工廠案例場景分析蘋果類優點缺點 小結 工廠模式客戶端調用**優點****缺點** 抽象工廠模式三個模式對比 前言 筆者之前學習了有關于設計模式的六大原則,之前簡單了解過這個工廠模式,今天主要是重新學習一下這個模式,正式系統…

【機器學習】工具入門:飛牛啟動Dify Ollama Deepseek

很久沒有更新文章了,最近正好需要研究一些機器學習的東西&#xff0c;打算研究一下 difyOllama 以下是基于FN 的dify本地化部署&#xff0c;當然這也可能是全網唯一的飛牛部署dify手冊 部署 官方手冊&#xff1a;https://docs.dify.ai/en/getting-started/install-self-hos…

安卓A15系統實現修改鎖屏界面默認壁紙功能

最近遇到一個A15系統項目&#xff0c;客戶要求修改鎖屏界面的默認壁紙&#xff0c;客戶提供了一張壁紙圖片&#xff0c;但是從A15系統的源代碼查看時才知道谷歌已經去掉了相關的代碼&#xff0c;已經不支持了&#xff0c;A13和A14系統好像是支持的&#xff0c;A15系統的Wallpap…

從理論到實戰:模糊邏輯算法的深度解析與應用實踐

從理論到實戰&#xff1a;模糊邏輯算法的深度解析與應用實踐 一、模糊邏輯的核心概念與數學基礎 模糊邏輯&#xff08;Fuzzy Logic&#xff09;是一種處理不確定性的數學工具&#xff0c;其核心思想是將傳統布爾邏輯的“非黑即白”擴展為連續的隸屬度函數。例如&#xff0c;在…

正向代理與反向代理區別及應用

正向代理和反向代理是兩種常見的代理服務器類型&#xff0c;它們在網絡架構中扮演不同角色&#xff0c;核心區別在于代理對象和使用場景。 1. 正向代理&#xff08;Forward Proxy&#xff09; 定義&#xff1a;正向代理是客戶端&#xff08;如瀏覽器&#xff09;主動配置的代理…

OpenCV CUDA模塊中逐元素操作------邏輯運算

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 比較、AND、OR、NOT等。這類操作可用于創建基于條件的掩碼&#xff0c;這對于圖像分割或特征選擇非常有用。 主要函數 1. 按位與 (cv::cuda::b…

一臺入網的電腦有6要素, 機器名,mac,ip,俺碼,網關,dns,分別有什么作用

一臺入網的電腦需要配置的 六大網絡要素&#xff08;機器名、MAC地址、IP地址、子網掩碼、網關、DNS&#xff09;各自承擔不同的關鍵作用&#xff0c;共同確保設備能正確通信和訪問網絡資源。以下是它們的詳細功能解析&#xff1a; 1. 機器名&#xff08;主機名&#xff09; 作…

MySQL之儲存引擎和視圖

一、儲存引擎 基本介紹&#xff1a; 1、MySQL的表類型由儲存引擎(Storage Engines)決定&#xff0c;主要包括MyISAM、innoDB、Memory等。 2、MySQL數據表主要支持六種類型&#xff0c;分別是&#xff1a;CSV、Memory、ARCHIVE、MRG_MYISAN、MYISAM、InnoBDB。 3、這六種又分…

【Spring Boot后端組件】mybatis-plus使用

文章目錄 mybatis-plus使用一、依賴引入二、添加相關配置項三、功能詳解1.自增主鍵2.邏輯刪除3.操作時間自動填充4.其他字段自動填充5.分頁查詢6.自定義動態查詢7.代碼生成器8.代碼生成器(自定義模板) mybatis-plus使用 一、依賴引入 pom.xml文件 <?xml version"1.…

docker compose 啟動指定的 service

使用 Docker Compose 啟動指定服務 要在 Docker Compose 中啟動特定的服務而不是所有服務&#xff0c;可以使用以下命令&#xff1a; docker compose up [服務名] 基本用法 啟動單個服務&#xff1a; docker compose up service_name 啟動多個指定服務&#xff1a; docker …

wordcount程序

### 在 IntelliJ IDEA 中編寫和運行 Spark WordCount 程序 要使用 IntelliJ IDEA 編寫并運行 Spark 的 WordCount 程序&#xff0c;需按照以下流程逐步完成環境配置、代碼編寫以及任務提交。 --- #### 1. **安裝與配置 IntelliJ IDEA** 確保已正確安裝 IntelliJ IDEA&#x…

SmartETL函數式組件的設計與應用

SmartETL框架主要采用了面向對象的設計思想&#xff0c;將ETL過程中的處理邏輯抽象為Loader和Processor&#xff08;對應loader模塊和iterator模塊&#xff09;&#xff0c;所有流程組件需要繼承或實現DataProvider&#xff08;iter方法&#xff09;或JsonIterator&#xff08;…

鴻蒙AI開發:10-多模態大模型與原子化服務的集成

鴻蒙AI開發&#xff1a;10-多模態大模型與原子化服務的集成 在鴻蒙生態中&#xff0c;多模態大模型與原子化服務的集成是一個重要課題。本文將介紹如何在鴻蒙平臺上進行多模態大模型與原子化服務的集成&#xff0c;以及相關的技術細節和實際案例。 鴻蒙AI開發概述 什么是鴻蒙AI…

python打卡day29@浙大疏錦行

知識點回顧 類的裝飾器裝飾器思想的進一步理解&#xff1a;外部修改、動態類方法的定義&#xff1a;內部定義和外部定義 作業&#xff1a;復習類和函數的知識點&#xff0c;寫下自己過去29天的學習心得&#xff0c;如對函數和類的理解&#xff0c;對python這門工具的理解等&…

20250516使用TF卡將NanoPi NEO core開發板出廠的Ubuntu core22.04.3系統降級到Ubuntu core16.04.2

20250516使用TF卡將NanoPi NEO core開發板出廠的Ubuntu core22.04.3系統降級到Ubuntu core16.04.2 2025/5/16 10:58 緣起&#xff1a;NanoPi NEO core核心板出廠預制的OS操作系統為Ubuntu core22.04.3系統。 【雖然是友善之臂提供的最新的系統&#xff0c;但是缺少很多用用程序…

密西根大學新作——LightEMMA:自動駕駛中輕量級端到端多模態模型

導讀 目前將自動駕駛與視覺語言模型&#xff08;VLMs&#xff09;結合的研究越來越火熱&#xff0c;VLMs已經證明了其對自動駕駛的重要作用。本文引入了一種用于自動駕駛的輕量級端到端多模態模型LightEMMA&#xff0c;它能夠集成和評估當前的商業和開源模型&#xff0c;以研究…

框架之下再看HTTP請求對接后端method

在當今的軟件開發領域&#xff0c;各類框架涌現&#xff0c;極大地提升了開發效率。以 Java 開發為例&#xff0c;Spring 框架不斷演進&#xff0c;Spring Boot 更是簡化到只需引入 Maven 包&#xff0c;添加諸如SpringBootApplication、RestController等注解&#xff0c;就能輕…