使用C++编写TCP服务端程序

要使用Boost.Asio库来开发一个TCP服务端程序,你需要遵循以下步骤。下面的示例代码将演示如何创建一个简单的异步TCP服务器,它能够接收客户端连接,并异步处理请求和响应。

首先,确保你已经安装了Boost库,并在你的项目中包含了asio库。

以下是基本的代码框架:

#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <boost/system/error_code.hpp>
#include <iostream>
#include <memory>using boost::asio::ip::tcp;class Server {
public:Server(boost::asio::io_context& io_context, short port): acceptor_(io_context, tcp::endpoint(tcp::v4(), port)){// 启动监听start_accept();}private:void start_accept() {// 创建新的socketstd::shared_ptr<tcp::socket> new_socket = std::make_shared<tcp::socket>(acceptor_.get_executor().context());// 异步接受连接acceptor_.async_accept(*new_socket,[this, new_socket](boost::system::error_code ec) {if (!ec) {std::cout << "New connection accepted." << std::endl;// 异步读取请求数据boost::asio::async_read(*new_socket, boost::asio::buffer(buffer_),[this, new_socket](boost::system::error_code ec, std::size_t length) {if (!ec) {// 处理请求(这里只是简单地将接收到的数据原样返回)boost::asio::async_write(*new_socket, boost::asio::buffer(buffer_, length),[new_socket](boost::system::error_code ec, std::size_t /*length*/) {if (ec) {std::cerr << "Error: " << ec.message() << std::endl;} else {std::cout << "Response sent successfully." << std::endl;}});} else {std::cerr << "Read failed: " << ec.message() << std::endl;}});// 继续监听下一个连接start_accept();} else {std::cerr << "Accept failed: " << ec.message() << std::endl;}});}tcp::acceptor acceptor_;char buffer_[1024];
};int main() {try {boost::asio::io_context io_context;Server s(io_context, 12345);io_context.run();}catch (std::exception& e) {std::cerr << e.what() << std::endl;}return 0;
}

在这个例子中:

  • 我们定义了一个Server类,它包含一个acceptor用于接受新连接。
  • start_accept函数用于启动异步接受过程,当有新的连接到达时,它会创建一个新的socket并绑定到一个lambda函数中,该函数处理读取请求、处理请求以及写入响应。
  • 请求数据被读取到buffer_中,然后原样返回给客户端。
  • 使用io_context.run()启动事件循环,处理所有的I/O操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/45463.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

普通打工人,如何应对AI的滚滚巨轮:智对AI巨轮,行稳致远——普通打工人的智慧修行

智对AI巨轮&#xff0c;行稳致远——普通打工人的智慧修行 阿弥陀佛&#xff0c;善哉善哉。在这科技日新月异的时代&#xff0c;AI之巨轮滚滚向前&#xff0c;势不可挡&#xff0c;令世间万物皆为之变。作为普通打工人&#xff0c;身处其间&#xff0c;我们虽非那掌舵之人&…

YOLOv5改进 | 注意力机制| 对小目标友好的BiFormer【CVPR2023】

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 专栏目录&#xff1a; 《YOLOv5入门 改…

从新手到进阶:高效设计 Tableau 可视化的 5 种技巧 | 数据可视化分析

让我们一起跟着大神学习五个超实用的技巧&#xff0c;加速你的可视化分析之旅&#xff01; 在日常分析中&#xff0c;人人都想实现可视化最佳实践。然而&#xff0c;对于很多初学者来说&#xff0c;在还未熟练掌握 Tableau 的情况下&#xff0c;这种愿望貌似不太符合实际。 为…

【HarmonyOS】获取通讯录信息

【HarmonyOS】获取通讯录信息 一、问题背景&#xff1a; 在Android和IOS中&#xff0c;获取手机通讯录信息的方式&#xff0c;一般是申请通讯录权限后&#xff0c;获得手机所有的通讯录列表信息。 在鸿蒙中&#xff0c;因为权限方式安全性提高的变更&#xff1a;将用户权限限…

【八股系列】CSS盒模型:掌握网页布局的核心

&#x1f389; 博客主页&#xff1a;【剑九 六千里-CSDN博客】 &#x1f3a8; 上一篇文章&#xff1a;【Vue中的&#xff1c;keep-alive&#xff1e;组件&#xff1a;深入解析与实践指南】 &#x1f3a0; 系列专栏&#xff1a;【面试题-八股系列】 &#x1f496; 感谢大家点赞&…

爬虫管理解决方案:让数据收集变得高效且合规

一、为何数据收集的效率与合规性同等重要&#xff1f; 随着大数据技术的飞速发展&#xff0c;数据收集已成为企业决策与市场洞察的核心驱动力。然而&#xff0c;在信息海洋中精准捕捞的同时&#xff0c;如何确保这一过程既高效又不触碰法律的红线&#xff0c;是每个数据实践者…

深入探讨 Google 竞价:开启海外市场的神秘钥匙与潜在风险

在这个充满挑战与机遇的数字化时代&#xff0c;Google竞价犹如开启神秘宝藏的一把钥匙&#xff0c;引领众多企业走向海外市场的康庄大道。身为数字营销领域的资深人士&#xff0c;我对Google竞价的独特魅力及潜在风险有着深刻理解。今日&#xff0c;我将带领大家深入探讨这一既…

华为OJ平台

华为OJ是一个在线编程平台&#xff0c;用于支持**华为公司的软件开发岗位招聘流程&#xff0c;考察候选人在算法设计、编程和调试等方面的技能水平**。以下是有关它的介绍&#xff1a; 1. **平台功能** - **多语言支持**&#xff1a;华为OJ平台支持多种编程语言&#xff0c;包括…

[C++]封装

一、封装的定义 封装是面向对象编程&#xff08;OOP&#xff09;的三大基本特性之一&#xff08;封装、继承、多态&#xff09;。它指的是将数据&#xff08;属性&#xff09;和操作这些数据的方法&#xff08;函数&#xff09;结合成一个独立的单元&#xff08;类&#xff09…

Perl 基础语法精讲:变量、操作符与控制结构

Perl 基础语法精讲&#xff1a;变量、操作符与控制结构 第1节&#xff1a;Perl 语法基础 1.1 Perl 语法的基本概念 Perl 是一种解释型的高级脚本语言&#xff0c;广泛用于文本处理、系统管理任务等。 1.2 语法结构和编码风格 使用 # 注释代码。遵循良好的编码风格&#xf…

使用嵌入式知识打造智能手环:nRF52蓝牙开发实战(C++/BLE/传感器)

项目概述 现代人越来越注重健康管理&#xff0c;智能穿戴设备应运而生。本项目旨在利用低功耗蓝牙芯片nRF52832&#xff0c;结合加速度计、心率传感器、陀螺仪等传感器&#xff0c;开发一款功能完善、性能稳定的智能运动手环。该手环能够实时采集用户的运动数据和生理指标&…

用MATLAB绘制三向应力圆

% 定义主应力值 sigma1 100; % MPa sigma2 50; % MPa sigma3 -33; % MPa sigma_m1(sigma1 sigma3)/2; sigma_m2(sigma1 sigma2)/2; sigma_m3(sigma2 sigma3)/2; % 计算半径 r1 (sigma1 - sigma3) / 2; r2 (sigma1 - sigma2) / 2; r3 (sigma2 - sigma3…

《mysql篇》--JDBC编程

JDBC是什么 JDBC就是Java DataBase Connectivity的缩写&#xff0c;翻译过来就很好理解了&#xff0c;就是java连接数据库。所以顾名思义&#xff0c;JDBC就是一种用于执行SQL语句的JavaApl&#xff0c;是Java中的数据库连接规范。为了可以方便的用Java连接各种数据库&#xff…

中国高端水果元宇宙

果蔬&#xff0c;即水果和蔬菜&#xff0c;是人类饮食中不可或缺的一部分。它们富含维生素、矿物质、膳食纤维以及抗氧化剂等对人体健康至关重要的营养素。果蔬的摄入被广泛认为是预防多种慢性疾病&#xff0c;如心血管疾病、糖尿病、肥胖和某些癌症的有效手段。 ###水果的特点…

【Python】从基础到进阶(三):深入了解Python中的运算符与表达式

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 一、引言二、运算符1. 算术运算符2. 比较运算符3. 逻辑运算符4. 位运算符5. 赋值运算符6. 其他运算符 三、表达式1. 表达式的定义2. 运算符的优先级3. 使用括号提升可读性4. 组合运算符与复合表达式 四、案例&#xff1a;计…

使用Java和WebSocket设计大型聊天系统的理论探讨

随着互联网的快速发展&#xff0c;实时通信已成为各类应用的重要组成部分。聊天系统不仅应用于社交媒体&#xff0c;还广泛用于客户服务、在线教育、远程办公等领域。本文将从理论角度探讨如何使用Java和WebSocket设计一个高效、可扩展的大型聊天系统&#xff0c;详细介绍各个关…

微信管理神器能解决哪些问题?

1、为了自身利益&#xff0c;销售离职单独干&#xff08;带走客户&#xff09; 企业的客户都被销售带走了&#xff0c;那企业会遭到一定的损失&#xff0c;客户的资源是非常保密或重要的。 2、销售客户难以统计&#xff0c;不知道销售整体在干啥&#xff08;没有统计&#xf…

redis学习(009 实战:黑马点评:缓存穿透、缓存雪崩 、缓存击穿)

黑马程序员Redis入门到实战教程&#xff0c;深度透析redis底层原理redis分布式锁企业解决方案黑马点评实战项目 总时长 42:48:00 共175P 此文章包含第40p-第p45的内容 文章目录 缓存穿透解决方案缓存空对象布隆过滤 解决方案实现缓存穿透总结 缓存雪崩解决方案 缓存击穿解决方…

C++:获取当前可执行核心数(开辟线程)

sysconf(_SC_NPROCESSORS_ONLN) 是一个在 POSIX 兼容系统上广泛使用的函数&#xff0c;它用于获取当前系统上可用的处理器&#xff08;CPU 核心&#xff09;的数量。这个函数是 sysconf 函数的一个特定调用&#xff0c;其中 _SC_NPROCESSORS_ONLN 是一个常量&#xff0c;指定了…

Go协程与通道的综合应用问题

1.简单了解什么是协程和通道 什么是协程 协程&#xff0c;是一种用户级的轻量级的线程&#xff0c;拥有独立的栈空间并共享程序的堆空间。 它是在单线程的基础上通过算法来实现的微线程&#xff0c;相比于多线程编程具有以下优点&#xff1a; 协程的上下文切换由用户决定&a…