【C++網絡編程】第2篇:簡單的TCP服務器與客戶端

一、TCP通信流程回顧

1. 服務器端流程

1. 創建Socket → socket()
2. 綁定地址和端口 → bind()
3. 開始監聽 → listen()
4. 接受客戶端連接 → accept()
5. 接收/發送數據 → recv()/send()
6. 關閉連接 → closesocket()

2. 客戶端流程

1. 創建Socket → socket()
2. 連接服務器 → connect()
3. 發送/接收數據 → send()/recv()
4. 關閉連接 → closesocket()

二、實現TCP服務器(Echo示例)?

1. 完整代碼

#include <iostream>
#include <winsock2.h>
#include <ws2tcpip.h> 
#pragma comment(lib, "ws2_32.lib")  // 自動鏈接Winsock庫#include <ctype.h>
#include <limits.h>int main() {// 1. 初始化WinsockWSADATA wsaData;if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {std::cerr << "WSAStartup failed!" << std::endl;return 1;}// 2. 創建SocketSOCKET serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if (serverSocket == INVALID_SOCKET) {std::cerr << "Socket creation failed: " << WSAGetLastError() << std::endl;WSACleanup();return 1;}// 3. 綁定地址和端口sockaddr_in serverAddr;serverAddr.sin_family = AF_INET;inet_pton(AF_INET,"127.0.0.1", &(serverAddr.sin_addr.s_addr));  // 本地回環地址serverAddr.sin_port = htons(8080);                    // 監聽8080端口if (bind(serverSocket, (sockaddr*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) {std::cerr << "Bind failed: " << WSAGetLastError() << std::endl;closesocket(serverSocket);WSACleanup();return 1;}// 4. 開始監聽if (listen(serverSocket, SOMAXCONN) == SOCKET_ERROR) {std::cerr << "Listen failed: " << WSAGetLastError() << std::endl;closesocket(serverSocket);WSACleanup();return 1;}std::cout << "Server started. Listening on 127.0.0.1:8080..." << std::endl;// 5. 接受客戶端連接sockaddr_in clientAddr;int clientAddrLen = sizeof(clientAddr);SOCKET clientSocket = accept(serverSocket, (sockaddr*)&clientAddr, &clientAddrLen);if (clientSocket == INVALID_SOCKET) {std::cerr << "Accept failed: " << WSAGetLastError() << std::endl;closesocket(serverSocket);WSACleanup();return 1;}// 6. 接收并回傳數據(Echo)char buffer[1024];int bytesReceived;do {bytesReceived = recv(clientSocket, buffer, sizeof(buffer), 0);if (bytesReceived > 0) {send(clientSocket, buffer, bytesReceived, 0);  // 原樣返回數據std::cout << "Echoed " << bytesReceived << " bytes. Datas:" << std::string(buffer, bytesReceived) << std::endl;}} while (bytesReceived > 0);// 7. 清理資源closesocket(clientSocket);closesocket(serverSocket);WSACleanup();return 0;
}

三、實現TCP客戶端

1. 完整代碼

#include <iostream>
#include <string>
#include <winsock2.h>
#include <ws2tcpip.h> 
#pragma comment(lib, "ws2_32.lib")int main() {// 1. 初始化WinsockWSADATA wsaData;if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {std::cerr << "WSAStartup failed!" << std::endl;return 1;}// 2. 創建SocketSOCKET clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if (clientSocket == INVALID_SOCKET) {std::cerr << "Socket creation failed: " << WSAGetLastError() << std::endl;WSACleanup();return 1;}// 3. 連接服務器sockaddr_in serverAddr;serverAddr.sin_family = AF_INET;inet_pton(AF_INET, "127.0.0.1", &(serverAddr.sin_addr.s_addr));serverAddr.sin_port = htons(8080);if (connect(clientSocket, (sockaddr*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) {std::cerr << "Connect failed: " << WSAGetLastError() << std::endl;closesocket(clientSocket);WSACleanup();return 1;}std::cout << "Connected to server. Enter messages to send (type 'exit' to quit):" << std::endl;// 4. 發送和接收數據std::string message;char buffer[1024];do {std::getline(std::cin, message);if (message == "exit") break;// 發送數據send(clientSocket, message.c_str(), message.size(), 0);// 接收回顯int bytesReceived = recv(clientSocket, buffer, sizeof(buffer), 0);if (bytesReceived > 0) {std::cout << "Server echoed: " << std::string(buffer, bytesReceived) << std::endl;}} while (true);// 5. 清理資源closesocket(clientSocket);WSACleanup();return 0;
}

四、關鍵代碼解析

1. socket() 參數說明

  • AF_INET:IPv4地址族。
  • SOCK_STREAM:面向流的傳輸協議(TCP)。
  • IPPROTO_TCP:明確指定TCP協議(可填0自動選擇)。

2. bind() 的地址設置

  • INADDR_ANY:若服務器需要監聽所有網卡,可改為:
serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);  // 監聽所有網卡

3. listen() 的待處理隊列

  • SOMAXCONN:系統允許的最大掛起連接數(Windows默認為200)。

4. accept() 的阻塞特性

  • 若無客戶端連接,accept()會一直阻塞,直到新連接到達。

五、運行與測試

1. 客戶端輸入/輸出

在這里插入圖片描述

2. 服務器端輸出

在這里插入圖片描述

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

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

相關文章

Spring IoC DI入門

一、Spring&#xff0c;Spring Boot和Spring MVC的聯系及區別 Spring是另外兩個框架的基礎&#xff0c;是Java生態系統的核心框架&#xff0c;而SpringMVC是Spring 的子模塊&#xff0c;專注于 Web 層開發&#xff0c;基于 MVC 設計模式&#xff08;模型-視圖-控制器&#xff…

【uniapp】記錄tabBar不顯示踩坑記錄

由于很久沒有使用uniapp了&#xff0c;官方文檔看著又雜亂&#xff0c;底部tab導航欄一直沒顯示&#xff0c;苦思許久&#xff0c;沒有發現原因&#xff0c;最后網上搜到帖子&#xff0c;list里的第一個數據&#xff0c;pages 的第一個 path 必須與 tabBar 的第一個 pagePath 相…

Zabbix安裝(保姆級教程)

Zabbix 是一款開源的企業級監控解決方案&#xff0c;能夠監控網絡的多個參數以及服務器、虛擬機、應用程序、服務、數據庫、網站和云的健康狀況和完整性。它提供了靈活的通知機制&#xff0c;允許用戶為幾乎任何事件配置基于電子郵件的告警&#xff0c;從而能夠快速響應服務器問…

穿透遞歸的本質:從無限夢境到可控魔法的蛻變之路

穿透遞歸的本質&#xff1a;從無限夢境到可控魔法的蛻變之路&#xff08;C實現&#xff09; 一、遞歸&#xff1a;程序員的盜夢空間 在計算機科學的宇宙中&#xff0c;遞歸是最接近魔法本質的編程范式。它像一面鏡子中的鏡子&#xff0c;引導我們通過自我相似性破解復雜問題。…

1.5.4 掌握Scala內建控制結構 - 條件循環

本次實戰主要圍繞Scala語言中的內建控制結構&#xff0c;特別是條件循環進行學習和實踐。通過while循環和do-while循環兩種結構&#xff0c;分別實現了計算1到100的累加和以及打印所有水仙花數的任務。在while循環中&#xff0c;首先定義了初始條件和循環條件&#xff0c;然后通…

MySQL程序

博主主頁: 碼農派大星. 數據結構專欄:Java數據結構 數據庫專欄:數據庫 JavaEE專欄:JavaEE 軟件測試專欄:軟件測試 關注博主帶你了解更多知識 1. mysqld (MySQL服務器) mysqld也被稱為MySQL服務器&#xff0c;是?個多線程程序&#xff0c;對數據?錄進?訪問管理(包含數據庫…

0321美團實習面試——技能大致內容

專業技能 1.掌握盒?模型&#xff0c;Flex響應式布局和BFC等問題 盒?模型 Flex布局 媒體查詢 結合Handleresize.ts監聽設備 BFC 2.掌握原型鏈&#xff0c;異步&#xff0c;事件循環和閉包等問題 原型鏈 異步 class Promise {static resolve(value) {if (value instanceof…

分布式任務調度

今天我們講講分布式定時任務調度—ElasticJob。 一、概述 1、什么是分布式任務調度 我們可以思考?下下?業務場景的解決?案: 某電商平臺需要每天上午10點&#xff0c;下午3點&#xff0c;晚上8點發放?批優惠券 某銀?系統需要在信?卡到期還款?的前三天進?短信提醒 某…

微分方程求解及推導過程

微分方程求解及推導過程 本文將系統地推導微分方程&#xff1a; d z ( t ) d t A z ( t ) B u ( t ) \frac{\mathrm{d}\boldsymbol{z}(t)}{\mathrm{d}t} \boldsymbol{A}z(t) \boldsymbol{B}u(t) dtdz(t)?Az(t)Bu(t) 的通解過程&#xff0c;并分析其物理意義。 1. 初始條…

SQL 中 WHERE 與 HAVING 子句的使用

在編寫 SQL 查詢時&#xff0c;數據過濾是常見需求。WHERE 和 HAVING 子句雖然都用于篩選數據&#xff0c;但實際用法大不相同。本文通過具體示例對比兩者的核心區別&#xff0c;并結合實際場景演示聯合使用技巧&#xff0c;助力快速掌握這兩個關鍵工具的正確用法。 一、數據表…

Sampling – Model Context Protocol Specification

網頁鏈接 https://spec.modelcontextprotocol.io/specification/draft/client/sampling/ 主要內容概述 該網頁詳細介紹了Model Context Protocol (MCP) 中的“Sampling”功能。Sampling允許服務器通過客戶端請求語言模型&#xff08;LLM&#xff09;生成文本、音頻或圖像內容…

STM32-匯編2、外設

1.異常處理 reserved保留 &#xff1b;將所有異常都初始化成一個函數 2.nop 空指令&#xff0c;什么不干&#xf…

匯能感知高品質的多光譜相機VSC02UA

VSC02UA概要 VSC02UA是一款高品質的200萬像素的光譜相機&#xff0c;適用于工業檢測、農業、醫療等領域。VSC02UA 包含 1600 行1200 列有源像素陣列、片上 10 位 ADC 和圖像信號處理器。它帶有 USB2.0 接口&#xff0c;配合專門的電腦上位機軟件使用&#xff0c;可進行圖像采集…

在C語言基礎上學Java【Java】【一】

眾所周知&#xff0c;Java是C風格的語言&#xff0c;對于學過C語言的人學Java可以快速適應。 廢話不多說&#xff0c;直接邊看代碼邊學。 數據類型&#xff0c;輸入和輸出 import java.util.Scanner;//為了使用Scanner public class a1 {//a1是類名&#xff0c;就是文件名&am…

Spring組件初始化擴展點:BeanPostProcessor

目錄 一、概述二、BeanPostProcessor的作用三、核心方法解析1、postProcessBeforeInitialization2、postProcessAfterInitialization 四、實戰案例案例1&#xff1a;實現簡單的屬性打印案例2&#xff1a;動態代理增強&#xff08;模擬AOP&#xff09; 五、常見應用場景六、注意…

多模態RAG框架(二)OmniSearch (Self-adaptive Planning Agent) and Dynamic VQA Dataset

OmniSearch&#xff1a;Benchmarking Multimodal RAG with Dynamic VQA Dataset and Self-adaptive Planning Agent 文章鏈接&#xff1a;2411.02937 Github鏈接&#xff1a;Alibaba-NLP/OmniSearch: Repo for Benchmarking Multimodal Retrieval Augmented Generation with …

Multisim學習-04 示波器的使用

我們選擇一個信號源來說明示波器的使用。 模擬電路中平常一般用ac&#xff0c;am&#xff0c;fm&#xff0c;clock就可以演示了。 截圖說明&#xff1a; 1&#xff09;波的周期時長&#xff0c;首先應該調整這個參數&#xff0c;它的倒數就是頻率。這個參數如果不適合&#xf…

2025年03月16日Github流行趨勢

項目名稱&#xff1a;glance 項目地址url&#xff1a;https://github.com/glanceapp/glance項目語言&#xff1a;Go歷史star數&#xff1a;13768今日star數&#xff1a;889項目維護者&#xff1a;svilenmarkov, c0smicdev, wfg, DVDAndroid, jonasknobloch項目簡介&#xff1a;…

aws訓練快速入門教程

AWS 相關核心概念 簡潔地介紹一下AWS訓練云服務的核心關聯概念: AWS核心服務層: 基礎設施層: EC2(計算), S3(存儲), RDS(數據庫)等人工智能層: SageMaker(訓練平臺), AI服務等 機器學習服務分級: 高層: 預構建AI服務(開箱即用)中層: SageMaker(主要訓練平臺)底層: 框架和基…

對接股票金融數據源API

StockTV 股票市場API StockTV 提供全面的實時和歷史股市數據 API&#xff0c;涵蓋全球股票、外匯、期貨及市場新聞數據&#xff0c;助力投資者精準把握市場動態。 主要功能 實時和歷史股市數據 API 獲取全球股票市場的實時行情、歷史數據及深度分析&#xff0c;支持多語言查詢…