TCP/IP 網絡編程 | 服務端 客戶端的封裝

設計模式

文章目錄

  • 設計模式
    • 一、`socket.h` 接口(interface)
    • 二、`socket.cpp` 實現(implementation)
    • 三、`server.cpp` 使用封裝(main 函數)
    • 四、`client.cpp` 使用封裝(main 函數)
    • 五、退出方法
    • 六、終端輸出

一、socket.h 接口(interface)

#ifndef SOCKET_H
#define SOCKET_H#include <string>
using std::string;class Socket
{
public:Socket();~Socket();bool bind(int port);bool listen(int backlog = 5);int accept();bool connect(const string &ip, int port);  // ? 客戶端連接方法int fd() const { return m_sockfd; } // 可選:暴露 sockfd 方便客戶端用private:int m_sockfd;
};#endif // SOCKET_H

二、socket.cpp 實現(implementation)

// socket.cpp
#include "socket.h"#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <cstring>
#include <cstdio>
#include <cerrno>using std::string;Socket::Socket()
{m_sockfd = ::socket(AF_INET, SOCK_STREAM, 0);if (m_sockfd < 0){printf("Socket creation failed: errno=%d, errmsg=%s\n", errno, strerror(errno));}
}Socket::~Socket()
{if (m_sockfd >= 0){::close(m_sockfd);}
}bool Socket::connect(const string &ip, int port)
{sockaddr_in addr;std::memset(&addr, 0, sizeof(addr));addr.sin_family = AF_INET;addr.sin_port = htons(port);if (::inet_pton(AF_INET, ip.c_str(), &addr.sin_addr) <= 0){printf("Invalid IP address: %s\n", ip.c_str());return false;}int ret = ::connect(m_sockfd, (struct sockaddr*)&addr, sizeof(addr));if (ret < 0){printf("Connect failed: errno=%d, errmsg=%s\n", errno, strerror(errno));return false;}return true;
}void Socket::close()
{if (m_sockfd >= 0){::close(m_sockfd);m_sockfd = -1;}
}

三、server.cpp 使用封裝(main 函數)

#include "socket.h"#include <iostream>
#include <unistd.h>    // read(), write()
#include <cstring>     // memsetint main()
{Socket server;if (!server.bind(8888)){std::cerr << "Failed to bind port 8888" << std::endl;return 1;}if (!server.listen()){std::cerr << "Failed to listen on port 8888" << std::endl;return 1;}std::cout << "Server listening on port 8888..." << std::endl;while (true){int client_fd = server.accept();if (client_fd < 0){continue; // accept failed}char buffer[1024];ssize_t n = ::read(client_fd, buffer, sizeof(buffer) - 1);if (n > 0){buffer[n] = '\0';std::cout << "Received: " << buffer << std::endl;std::string response = "Echo: ";response += buffer;::write(client_fd, response.c_str(), response.size());}::close(client_fd);}return 0;
}

四、client.cpp 使用封裝(main 函數)

#include "socket.h"#include <iostream>
#include <unistd.h>     // read(), write()
#include <cstring>      // strlen()int main()
{Socket client;if (!client.connect("127.0.0.1", 8888)){std::cerr << "Failed to connect to server." << std::endl;return 1;}std::cout << "Connected to server." << std::endl;std::string input;while (true){std::cout << "Enter message: ";std::getline(std::cin, input);if (input == "exit")break;::write(client.fd(), input.c_str(), input.size());char buffer[1024];ssize_t n = ::read(client.fd(), buffer, sizeof(buffer) - 1);if (n > 0){buffer[n] = '\0';std::cout << "Server response: " << buffer << std::endl;}else{std::cout << "Server closed connection." << std::endl;break;}}return 0;
}

五、退出方法

  1. 客戶端:
    當你在客戶端輸入:
Enter message: exit

客戶端程序會退出(break 出循環)。

  1. 服務器:
    • 當前版本是永不退出的死循環
    • 你可以使用 Ctrl+C 來中斷服務器進程

六、終端輸出

  1. 終端 1:服務器
$ ./server
Server listening on port 8888...
Received: hello
Received: world
  1. 終端 2:客戶端
$ ./client
Connected to server.
Enter message: hello
Server response: Echo: helloEnter message: world
Server response: Echo: worldEnter message: exit

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

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

相關文章

TASTE-Rob:推進面向任務的手-目標交互視頻生成,實現可通用的機器人操作

25年3月來自香港中文大學的論文“TASTE-Rob: Advancing Video Generation of Task-Oriented Hand-Object Interaction for Generalizable Robotic Manipulation”。 本文也是在解決現有數據集和模型在面向任務的手部-目標交互視頻生成方面的關鍵限制&#xff0c;這是為機器人模…

Trae AI IDE 全網最全的使用教程

Trae AI IDE 全網最全的使用教程 近期&#xff0c;字節發布了一款 AI Coding 產品 —— Trae&#xff0c;它是一款對標 Cursor 和 Windsurf 的全新 IDE&#xff0c;也是一款真正為中文開發者量身定制的工具&#xff0c;可謂是中文開發者的福音。 其優雅的 UI、絲滑的交互、母語…

GraspCorrect:通過視覺-語言模型引導反饋進行機器人抓握矯正

25年3月來自韓國 POSTECH 的論文 “GraspCorrect: Robotic Grasp Correction via Vision-Language Model-Guided Feedback”。 盡管機器人操作技術取得了顯著進步&#xff0c;但實現一致且穩定的抓取仍然是一項根本挑戰&#xff0c;常常限制復雜任務的成功執行。分析表明&…

瀏覽器兼容-polyfill-本地服務-優化

babel和webpack結合 npx babel src --out-dir dist --presetsbabel/preset-env 這是把src下面的東西都用babel轉化一下 webpack可以和babel結合使用&#xff0c;首先下載一個這東西&#xff1a; npm install babel-loader -D webpack配置&#xff1a; const path requir…

組織結構圖軟件:數據驅動的可視化架構管理工具

1. 組織結構圖軟件概述 組織結構圖概念 組織結構圖是一種圖形化工具&#xff0c;用于展示組織內部的層級關系、部門職能和人員分工。它通過清晰的線條和文本框連接&#xff0c;直觀呈現企業或機構的架構&#xff0c;幫助管理者和員工快速理解組織的運作模式。 重要性 在企業…

大數據學習(138)-Hive數據分析3

????&#x1f34b;&#x1f34b;大數據學習&#x1f34b;&#x1f34b; &#x1f525;系列專欄&#xff1a; &#x1f451;哲學語錄: 用力所能及&#xff0c;改變世界。 &#x1f496;如果覺得博主的文章還不錯的話&#xff0c;請點贊&#x1f44d;收藏??留言&#x1f4…

深度學習環境搭建(pycharm+yolov5)

B站 &#xff1a;道傳科技上位機 觀看教程 一、pycharm的安裝 pycharm windows版本下載地址&#xff1a;Download PyCharm: The Python IDE for data science and web development by JetBrains 下載社區版本&#xff08;日常學習使用夠用了&#xff09;&#xff0c;專業版…

K8S中應用無法獲取用戶真實ip問題排查

現象 領導反饋生產環境的用戶ip有問題。登陸到這個頁面&#xff0c;發現是所有的用戶ip都是172.30.94.97&#xff0c;這是個內部網絡ip. 排查過程 1 登陸到應用前端nginx&#xff0c; 查看nginx的請求日志 172.30.94.97 - - [17/Jul/2024:02:02:54 0000] "POST /***/n…

2.倒排索引

傳統數據庫mysql使用的是正向索引 詞條是不允許重復的&#xff0c;給詞條創建唯一索引&#xff0c;根據詞條查找的速度就很快了。

【Android Studio】新建項目及問題解決

新建項目 按照《Android 第一行代碼》中 1.3 小節的步驟創建項目。 注意&#xff1a;Minimum API Level 用于設置項目的最低兼容版本。Android 5.0 以上的系統已經占據超過了 99.9% 的 Android 市場份額&#xff0c;因此這里指定為 API 21: Android 5.0 即可。 問題解決 &…

SX1268低功耗sub-1g芯片支持lora和GFSK調制

SX1268 射頻收發器是長距離無線應用的理想設備&#xff0c;支持410-810MHZ。它專為長電池壽命而設計&#xff0c;僅消耗4.2 mA的主動接收電流。SX1268 可以使用高效的集成功率放大器在490 MHz傳輸高達 22 dBm 的信號。在 780 MHZ時&#xff0c;SX1268 在天線端口傳輸10dBm的信號…

C#高級:利用反射讓字符串決定調用哪個方法

一、反射的實現 using System; using System.Reflection; using System.Threading.Tasks;public class Calculator {public int Add(int a, int b){return a b;}public int Subtract(int a, int b){return a - b;}public int Multiply(int a, int b){return a * b;}public do…

圖像二分類任務推薦使用Sigmoid函數?

?圖像二分類任務中可以使用Softmax作為激活函數&#xff0c;但通常更推薦使用Sigmoid函數?。Softmax函數可以將多個類別的輸出轉換成概率分布&#xff0c;適合多分類任務。在二分類任務中&#xff0c;雖然可以使用Softmax&#xff0c;但它會生成兩個輸出值&#xff08;每個類…

湖北理元理律師事務所:債務優化的法律邏輯與生活平衡術

在債務糾紛數量年均增長19%的背景下&#xff08;最高人民法院2023年數據&#xff09;&#xff0c;專業法律服務機構的價值不僅在于解決糾紛&#xff0c;更在于重構債務人與生活的平衡關系。湖北理元理律師事務所的實踐顯示&#xff0c;科學的債務優化需同時滿足三個維度&#x…

window 顯示驅動開發-處理視頻幀

Microsoft Direct3D 運行時調用用戶模式顯示驅動程序的 VideoProcessBeginFrame 和 VideoProcessEndFrame 函數&#xff0c;以指示用戶模式顯示驅動程序可以處理視頻幀的這些函數調用之間的時間段。 在用戶模式顯示驅動程序可以處理任何視頻幀之前&#xff0c;Microsoft Direct…

基于 React Native for HarmonyOS5 的跨平臺組件庫開發指南,以及組件示例

基于 React Native for HarmonyOS5 的跨平臺組件庫開發&#xff0c;需融合分層架構設計、鴻蒙原生能力橋接及性能優化技術&#xff0c;核心指南如下&#xff1a; ?一、分層架構設計? 采用 ?模塊化分層結構?&#xff0c;隔離平臺差異邏輯&#xff1a; ├── common_har …

一站式了解單例模式

引言 這是設計模式專欄的第一篇文章&#xff0c;在這個專欄里面會講到我們在開發中經常使用的設計模式&#xff0c;我會用心將它們解析&#xff0c;然后講給你們聽&#xff0c;如果感興趣可以持續關注這個專欄?? 這次我們要講的是單例模式&#xff0c;這個在大廠面試中十分…

Java應用Flink CDC監聽MySQL數據變動內容輸出到控制臺

文章目錄 maven 依賴自定義數據變化處理器flink cdc監聽驗證 maven 依賴 <properties><flink.version>1.14.0</flink.version><flink-cdc.version>2.3.0</flink-cdc.version></properties><dependencies><!-- Flink dependencie…

獵板厚銅PCB工藝能力如何?

在電子產業向高功率、高集成化狂奔的今天&#xff0c;電路板早已不是沉默的配角。當5G基站、新能源汽車、工業電源等領域對電流承載、散熱效率提出嚴苛要求時&#xff0c;一塊能夠“扛得住大電流、耐得住高溫”的厚銅PCB&#xff0c;正成為決定產品性能的關鍵拼圖。而在這條賽道…

業務:資產管理功能

文章目錄 一、項目背景1.1概述1.2編寫目的 二、注意點說明三、頁面效果四、代碼AssetManagementControllerHwinfoAssetManagementHwinfoAssetManagementServiceHwinfoAssetManagementServiceImplHwinfoAssetManagementMapperHwinfoAssetManagementMapper.xmlSfpAssetManagement…