VS2022通過C++網絡庫Boost.Asio創建一個簡單的同步TCP服務器和客戶端

Boost.Asio是一個用于網絡和異步編程的C++庫。它提供了一種跨平臺的方式來處理網絡編程和異步操作,使開發人員能夠創建高性能的網絡應用程序,asio幾乎支持所有你能夠想到的網絡協議,比如tcp、udp、ip、http、icmp等,C++通過asio庫可以輕松實現tcp和http服務器。(本博客默認你已經安裝好了boost庫,并且博主的boost庫版本是1.84.0,集成環境是VS2022)。

第一步配置boost庫的開發環境,相比于其他庫,VS2022配置boost庫的開發環境比較簡單,只需要包含頭文件和靜態鏈接庫就可以了。

首先創建兩個C++控制臺項目,BoostClient和BoostServer。

打開BoostClient的屬性,包含boost的頭文件目錄和靜態鏈接庫目錄就可以了。

首先是服務器端的代碼。

#include <iostream>
#include<boost/asio.hpp>
#include<string>
int main()
{int port = 3333;std::string saddr = "127.0.0.1";boost::asio::ip::address addr = boost::asio::ip::address::from_string(saddr);boost::asio::io_context ioc;boost::asio::ip::tcp::endpoint ep(addr, port);boost::asio::ip::tcp::acceptor ac(ioc, ep);while (true){boost::asio::ip::tcp::socket soc(ioc);//創建套接字必須使用上下文ac.accept(soc);char request[100] = "";soc.receive(boost::asio::buffer(request, 100));std::cout << "成功接收到了客戶端的消息:" << request<<std::endl;std::string reply = "你好客戶端,服務器成功接收到了你的消息";soc.send(boost::asio::buffer(reply, reply.size()));soc.close();}return 0;
}

同步類型的TCP服務器搭建起來相對簡單,首先創建一個上下文對象ioc,然后再創建一個端點對象ep,再創建一個監聽套接字對象ac,創建套接字對象必須要借助上下文對象,這是必須的,至于端點對象,你可以直接將它傳入acceptor的構造函數中,這樣就省略了綁定這一操作了,否則,你需要在創建完ac之后再調用bind函數,將ac和ep進行綁定。(其實acceptor就是一個特殊的套接字對象,本質就是套接字)。

ac.bind(ep);

然后就是接收客戶端的響應了,可以使用receive函數也可以使用read_some函數,發送響應就使用send函數或者write_some函數。

接著就是客戶端代碼。

#include <iostream>
#include<boost/asio.hpp>
int main()
{boost::asio::io_context ioc;boost::asio::ip::tcp::endpoint ep(boost::asio::ip::address::from_string("127.0.0.1"), 3333);boost::asio::ip::tcp::socket soc(ioc);soc.connect(ep);char request[100] = "";std::cin >> request;soc.send(boost::asio::buffer(request, 100));char rce[100] = "";soc.receive(boost::asio::buffer(rce, 100));std::cout << "成功收到了消息:" << rce<<std::endl;char reply[100] = { "你好服務器,這里是客戶端,我們成功收到了消息" };soc.send(boost::asio::buffer(reply, 300));
}

同樣地要先創建上下文,因為創建套接字必須使用上下文對象,然后創建端點對象,并把套接字對象連接到對應的端點進程,這樣客戶端和服務器端就成功連接了,之后用send和recevie函數進行數據讀寫就可以了。

運行代碼,首先運行服務器的代碼。

再運行兩次客戶端代碼,依次輸入1和2,注意先不要回車

輸入2后進行回車,發現沒有響應,是因為1先連接到了服務器,將線程阻塞了,必須執行完1的程序才會執行2的程序。

再對1進行回車,發現兩個程序都成功執行了。

服務器端也成功接收到了消息。

注意點:使用char數組來接收客戶端發送的消息的主要原因是,Boost.Asio的讀取操作需要一個可變的緩沖區,而char數組提供了這樣的緩沖區。Boost.Asio的讀取操作函數,如read_some()和receive,需要一個可變的緩沖區作為參數,用于存儲從套接字接收的數據。char數組是一種連續的內存塊,可以用于存儲二進制數據,因此在這種情況下非常適合作為緩沖區。另一方面,std::string是一個動態大小的字符序列,它可以自動調整大小以適應不同長度的字符串。雖然std::string也提供了訪問底層字符數組的方法(如`c_str()`和`data()`),但它并不是一個可變的緩沖區,而是一個字符串容器,所以在接收請求的時候更加推薦使用char類型的字符串,并且所有字符串都要初始化為空,不然會中文亂碼。

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

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

相關文章

找出第 K 大的異或坐標值

問題 給你一個二維矩陣 matrix 和一個整數 k &#xff0c;矩陣大小為 m x n 由非負整數組成。 矩陣中坐標 (a, b) 的 值 可由對所有滿足 0 < i < a < m 且 0 < j < b < n 的元素 matrix[i][j]&#xff08;下標從 0 開始計數&#xff09;執行異或運算得到。…

淺談網絡通信(1)

文章目錄 一、認識一些網絡基礎概念1.1、ip地址1.2、端口號1.3、協議1.4、協議分層1.5、協議分層的2種方式1.5.1、OSI七層模型1.5.2、TCP/IP五層模型[!]1.5.2.1、TCP/IP五層協議各層的含義及功能 二、網絡中數據傳輸的基本流程——封裝、分用2.1、封裝2.2、分用2.2.1、5元組 三…

基于大模型和RAG技術實現的開源項目

基于大模型和RAG技術實現的開源項目 為解決大模型的不足&#xff0c;使用RAG技術增強大模型生成內容的針對性和可讀性能力&#xff0c;有很多不錯的開源項目。例如下面的項目。 1 ragflow 優點&#xff1a;可以對文檔和知識庫進行管理&#xff0c;構建不同的知識庫&#xff…

python冰雹序列的探索與編程實現

新書上架~&#x1f447;全國包郵奧~ python實用小工具開發教程http://pythontoolsteach.com/3 歡迎關注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目錄 一、冰雹序列的奧秘 二、編程實現冰雹序列 三、測試與驗證 四、總結與展望 一、冰雹序列的…

整理好了!2024年最常見 20 道 Redis面試題(八)

上一篇地址&#xff1a;整理好了&#xff01;2024年最常見 20 道 Redis面試題&#xff08;七&#xff09;-CSDN博客 十五、Redis 的性能調優有哪些方法&#xff1f; Redis的性能調優是一個多方面的工作&#xff0c;涉及到硬件、配置、代碼層面的優化等多個方面。以下是一些常…

openEuler 22.03 LTS SP3源碼編譯部署OpenStack-Caracal

openEuler 22.03 LTS SP3源碼編譯部署OpenStack-Caracal 說明機器詳情安裝操作系統注意事項基礎準備Controller節點 && Compute節點 && Block節點關閉防火墻關閉selinux設置靜態IP更新安裝前準備Controller節點 && Compute節點 && Block節點設…

第十課,while循環

一&#xff0c;認識循環是什么 循環普遍存在于日常生活中&#xff0c;同樣&#xff0c;在程序中&#xff0c;循環功能也是至關重要的基礎功能。 當程序需要重復執行某一段代碼&#xff0c;利用循環可以輕松完成工作 例如我要你打印100次上課&#xff0c;直接寫100次print&…

python調用阿里云通義千問(q-wen-max)API-只能總結pdf文檔內容

文章目錄 通義千問插件PDF解析插件調用案例通義千問插件 Dashscope插件功能能夠使得大模型的生成內容與外部三方應用結合,使得模型生成的內容更加準確和豐富,模型將擁有更好的生成能力。您也可以通過開發自定義插件,來使得模型生成更符合您預期的結果。 使用插件功能,大模…

電子閱覽室在管理時需注意什么

關于如今的絕大多數人來說&#xff0c;想必都聽說過“電子閱覽室”這一概念。它首要運用在校園中&#xff0c;給學生們供給愈加豐厚的常識儲藏。它也是一個獨立的局域網&#xff0c;在校園網絡中作為重要的一個組成部分而存在。但是&#xff0c;一個好的電子閱覽室是需求滿意運…

LORA學習筆記3——訓練參數

訓練步長 Step&#xff08;步&#xff09;:模型訓練時ai模型會根據標注生成一個圖片&#xff0c;并與學習圖片進行對比&#xff0c;通過對比的結果調整嵌入向量。這樣的一個流程就被稱為“一步”。 如果一個訓練集中有50張圖片&#xff0c;每張圖片設定為要訓練10次&#xff…

CCF20231201——倉庫規劃

CCF20231201——倉庫規劃 代碼如下&#xff1a; #include<bits/stdc.h> using namespace std; int main() {int n,m,a[1001][11],b[1001]{0};cin>>n>>m;for(int i1;i<n;i){for(int j1;j<m;j)cin>>a[i][j];}for(int i1;i<n;i){bool foundfals…

設計模式在芯片驗證中的應用——模板方法

一、模板方法 模板方法(Template Method)設計模式是一種行為設計模式&#xff0c; 它在父類中定義了一個功能的框架&#xff0c; 允許子類在不修改結構的情況下重寫功能的特定步驟。也就是模板方法定義了一組有序執行的操作&#xff0c;將一些步驟的實現留給子類&#xff0c;同…

把自己的垃圾代碼發布到官方中央倉庫

參考博客&#xff1a;將組件發布到maven中央倉庫-CSDN博客 感謝這位博主。但是他的步驟有漏缺&#xff0c;相對進行補充 訪問管理頁面 網址&#xff1a;Maven Central 新注冊賬號&#xff0c;或者使用github快捷登錄&#xff0c;建議使用github快捷登錄 添加命名空間 注意&…

連接mysql的java代碼

要在Java中連接MySQL數據庫,你需要以下幾個步驟: 導入MySQL JDBC驅動:在項目中添加MySQL JDBC驅動的依賴。如果你使用的是Maven,可以在pom.xml中添加依賴;如果使用的是Gradle,可以在build.gradle中添加依賴;如果不使用構建工具,需要手動下載驅動并添加到項目中。 編寫J…

【Linux】進程通信實戰 —— 進程池項目

送給大家一句話: 沒有一顆星&#xff0c;會因為追求夢想而受傷&#xff0c;當你真心渴望某樣東西時&#xff0c;整個宇宙都會來幫忙。 – 保羅?戈埃羅 《牧羊少年奇幻之旅》 &#x1f3d5;?&#x1f3d5;?&#x1f3d5;?&#x1f3d5;?&#x1f3d5;?&#x1f3d5;? &a…

flink cdc mysql整理與總結

文章目錄 一、業務中常見的需要數據同步的場景CDC是什么FlinkCDC是什么CDC原理為什么是FlinkCDC業務場景flink cdc對應flink的版本 二、模擬案例1.阿里云flink sql2.開源flink sql(單機模式)flink 安裝安裝mysql3.flink datastream 三、總結 提示&#xff1a;以下是本篇文章正文…

mac中文件夾怎么顯示.git隱藏文件

1. 打開終端應用程序&#xff0c;然后進入到包含.git文件夾的目錄&#xff0c;可以使用以下命令來顯示隱藏文件和文件夾&#xff1a; defaults write com.apple.finder AppleShowAllFiles YES 2. 然后重啟 Finder&#xff1a; killall Finder

kali基本掃描工具(自帶)

免責聲明:本文僅做技術交流與學習...請勿非法破壞... 詳細用法: 命令 -h/百度/翻譯 fping 用法 hostlist 文件里面為ip fping -a -q -f hostlist -a 只看存活的 fping -g 202.100.1.1 202.100.1.255 -a -q > Ahost 輸出到Ahost文件上 nping nping -c 1 201.100.2.155-244 …

工具方法 - 如何在網上找資料

在查詢USB相關的技術資料時&#xff0c;官網的文檔中心里找到個spec的記錄&#xff0c;但下載鏈接沒有。然后在Google上搜索&#xff1a; fileytpe:pdf my_keyword 只找到一個收費的文檔下載網站&#xff0c;這讓我不開心。 于是在Yandex上搜了下&#xff0c;找到了兩個網站可以…

香橙派AIpro使用SSH遠程登錄

香橙派AIpro可以連接HDMI顯示器使用&#xff0c;也可以遠程登錄。這里采用MobaXterm軟件遠程登錄開發板。 首先要使得控制電腦和香橙派開發板連接到同一個局域網&#xff0c;兩者的IP地址能夠ping通。在Windows 下可以使用MobaXterm 遠程登錄開發板&#xff0c;首先新建一個ss…