当前位置: 首页 > news >正文

【Boost】Asio库学习(二)

Boost::Asio

同步TCP客户端

  • boost::asio::buffer() 函数可以使用std::array,会自动计算大小,也可以使用char [] 或者 std::vector。当服务器关闭连接, ip::tcp::socket::read_some() 函数会退出boost::asio::error::eof error
#include <array>
#include <iostream>
#include <boost/asio.hpp>using boost::asio::ip::tcp;int main(int argc, char* argv[])
{try{if (argc != 2){std::cerr << "Usage: client <host>" << std::endl;return 1;}boost::asio::io_context io_context;tcp::resolver resolver(io_context);tcp::resolver::results_type endpoints =resolver.resolve(argv[1], "daytime");tcp::socket socket(io_context);boost::asio::connect(socket, endpoints);for (;;){std::array<char, 128> buf;boost::system::error_code error;size_t len = socket.read_some(boost::asio::buffer(buf), error);if (error == boost::asio::error::eof)break; // Connection closed cleanly by peer.else if (error)throw boost::system::system_error(error); // Some other error.std::cout.write(buf.data(), len);}}catch (std::exception& e){std::cerr << e.what() << std::endl;}return 0;
}

同步TCP服务器

  • 一次只能处理一个连接的服务器
#include <ctime>
#include <iostream>
#include <string>
#include <boost/asio.hpp>using boost::asio::ip::tcp;std::string make_daytime_string()
{using namespace std; // For time_t, time and ctime;time_t now = time(0);return ctime(&now);
}int main()
{try{boost::asio::io_context io_context;tcp::acceptor acceptor(io_context, tcp::endpoint(tcp::v4(), 13));for (;;){tcp::socket socket(io_context);acceptor.accept(socket);std::string message = make_daytime_string();boost::system::error_code ignored_error;boost::asio::write(socket, boost::asio::buffer(message), ignored_error);}}catch (std::exception& e){std::cerr << e.what() << std::endl;}return 0;
}

异步TCP服务器

#include <ctime>
#include <functional>
#include <iostream>
#include <memory>
#include <string>
#include <boost/asio.hpp>using boost::asio::ip::tcp;std::string make_daytime_string()
{using namespace std; // For time_t, time and ctime;time_t now = time(0);return ctime(&now);
}class tcp_connection: public std::enable_shared_from_this<tcp_connection>
{
public:typedef std::shared_ptr<tcp_connection> pointer;static pointer create(boost::asio::io_context& io_context){return pointer(new tcp_connection(io_context));}tcp::socket& socket(){return socket_;}void start(){/* 要发送的数据保存在message_中,因为需要保证在异步操作完成前数据有效 */message_ = make_daytime_string();/* 使用boost::asio::async_write()而不是ip::tcp::socket::async_write_some()确保完整的数据被发送 */boost::asio::async_write(socket_, boost::asio::buffer(message_),std::bind(&tcp_connection::handle_write, shared_from_this(),boost::asio::placeholders::error,boost::asio::placeholders::bytes_transferred));/* 如果error和bytes_transferred不使用* 即函数为void handle_write(){}* 也可以改为boost::asio::async_write(socket_, boost::asio::buffer(message_),std::bind(&tcp_connection::handle_write, shared_from_this()));* 但是参数列表需要对应* */}private:tcp_connection(boost::asio::io_context& io_context): socket_(io_context){}void handle_write(const boost::system::error_code& /*error*/,size_t /*bytes_transferred*/){}tcp::socket socket_;std::string message_;
};class tcp_server
{
public:tcp_server(boost::asio::io_context& io_context): io_context_(io_context),acceptor_(io_context, tcp::endpoint(tcp::v4(), 13))	/* 初始化一个acceptor监听TCP 端口13 */{start_accept();}private:/* 创建一个socket,初始化一个异步接收操作 */void start_accept()	{tcp_connection::pointer new_connection =tcp_connection::create(io_context_);acceptor_.async_accept(new_connection->socket(),std::bind(&tcp_server::handle_accept, this, new_connection,boost::asio::placeholders::error));}/* 服务于客户端请求,并调用start_accept()初始化下一个接收操作 */void handle_accept(tcp_connection::pointer new_connection,const boost::system::error_code& error){if (!error){new_connection->start();}start_accept();}boost::asio::io_context& io_context_;tcp::acceptor acceptor_;
};int main()
{try{boost::asio::io_context io_context;tcp_server server(io_context);io_context.run();}catch (std::exception& e){std::cerr << e.what() << std::endl;}return 0;
}

http://www.mrgr.cn/news/20703.html

相关文章:

  • C# 排序算法之快速排序
  • 利用全核范数去噪技术优化彩色图像处理
  • Electron32-Vue3OS桌面管理os模板|vite5+electron32+arco后台os系统
  • Vue实现双向数据绑定
  • 信息安全保障
  • 支持图片和视频分割,SAM2最新分割一切大模型分享
  • 什么是视频矩阵
  • Windows10彻底关闭自带的防病毒功能
  • Java 使用 Redis
  • 详解大模型多轮对话的数据组织形式
  • [数据集][目标检测]电动车头盔佩戴检测数据集VOC+YOLO格式4235张5类别
  • 数据 结构(内核链表)
  • 高职院校全栈式信创实训基地解决方案
  • .NET 8月份红队武器库和资源集合
  • 机器学习之 PCA降维
  • 详细分析TypeScript 中的可选参数与属性:用问号 ? 提升代码灵活性
  • 同构字符串算法应用
  • vue3 项目中使用git
  • 2024-WK35-前沿技术动态
  • 团队动力之团队发展阶段理论