19.3 Boost Asio 多线程通信
多线程服务依赖于两个通用函数,首先boost::bind提供了一个高效的、简单的方法来创建函数对象和函数对象适配器,它的主要功能是提供了一种将函数和它的参数绑定到一起的方法,这种方法可以将具有参数的成员函数、普通函数以及函数对象转化为不带参数的函数对象。
当参数绑定后则下一步就需要使用多线程功能,Boost库中提供了boost::thread库,boost::thread可以用于创建线程、启动线程、等待线程执行结束以及线程间通信等多种操,有了这两个关键库那么我们只需要accept.accept(*sock)等待套接字上线,当有套接字上线后则自动创建MyThread子线程,使用该子线程维持会话,首先是服务端实现代码。
#include <iostream>
#include <boost/asio.hpp>
#include <boost/thread.hpp>
using namespace boost::asio;
std::string addr = "127.0.0.1";
// 创建子线程
void MyThread(boost::shared_ptr<ip::tcp::socket> socket)
{
// 获取当前IP信息
std::string local_address = socket->local_endpoint().address().to_string();
while (true)
{
try
{
if (addr == local_address)
{
char data[512];
size_t len = socket->read_some(buffer(data));
std::cout << data << std::endl;
}
}
catch (boost::system::system_error e)
{
return;
}
}
}
int main(int argc, char* argv[])
{
typedef boost::shared_ptr<ip::tcp::socket> socket_ptr;
io_service service;
// 绑定IP与端口地址
ip::tcp::endpoint ep(ip::tcp::v4(), 6666);
ip::tcp::acceptor accept(service, ep);
while (true)
{
socket_ptr sock(new ip::tcp::socket(service));
// 侦听套接字
accept.accept(*sock);
// 绑定套接字参数
boost::function0<void> function = boost::bind(MyThread, sock);
// 创建新的子线程
boost::thread threading(function);
}
system("pause");
return 0;
}
客户端代码如下所示,由于客户端无需实现多线程所以代码中只需要简单的调用socket.connect()链接到服务端,并调用write_some发送一条消息即可,代码如下图所示;
#include <iostream>
#include <string>
#include <boost/asio.hpp>
using namespace boost::asio;
int main(int argc, char *argv[])
{
io_service io_service;
ip::tcp::endpoint ep(ip::address::from_string("127.0.0.1"), 6666);
ip::tcp::socket socket(io_service);
// 链接到服务端
socket.connect(ep);
char buffer[1024] = "hello lyshark";
socket.write_some(boost::asio::buffer(buffer, 1024));
system("pause");
return 0;
}
运行上方服务端代码,然后开启三个客户端代码,读者可自行观察通信状态,此时三个客户端均实现了输出,如下图所示;

19.3 Boost Asio 多线程通信的更多相关文章
- 使用Boost.Asio编写通信程序
摘要:本文通过形像而活泼的语言简单地介绍了Boost::asio库的使用,作为asio的一个入门介绍是非常合适的,可以给人一种新鲜的感觉,同时也能让体验到asio的主要内容. Boost.Asio是一 ...
- 如何在多线程leader-follower模式下正确的使用boost::asio。
#include <assert.h> #include <signal.h> #include <unistd.h> #include <iostream& ...
- 使用Boost asio实现同步的TCP/IP通信
可以先了解一下Boost asio基本概念,以下是Boost asio实现的同步TCP/IP通信: 服务器程序部分,如果想保留套接字之后继续通信,可以动态申请socket_type,保存指针,因为so ...
- 使用Boost asio实现异步的TCP/IP通信
可以先了解一下Boost asio基本概念,以下是Boost asio实现的异步TCP/IP通信: 服务器: #include "stdafx.h" #include <io ...
- 浅谈 Boost.Asio 的多线程模型
Boost.Asio 有两种支持多线程的方式,第一种方式比较简单:在多线程的场景下,每个线程都持有一个io_service,并且每个线程都调用各自的io_service的run()方法. 另一种支持多 ...
- <转>浅谈 Boost.Asio 的多线程模型
本文转自:http://senlinzhan.github.io/2017/09/17/boost-asio/ Boost.Asio 有两种支持多线程的方式,第一种方式比较简单:在多线程的场景下,每个 ...
- (原创)如何使用boost.asio写一个简单的通信程序(一)
boost.asio相信很多人听说过,作为一个跨平台的通信库,它的性能是很出色的,然而它却谈不上好用,里面有很多地方稍不注意就会出错,要正确的用好asio还是需要花一番精力去学习和实践的,本文将通过介 ...
- 通信有连接有消息队列选择boost.asio
通信有连接有消息队列选择boost.asio 连接自主管理 消息队列自主管理
- socket通信框架——boost asio
boost asio是一个封装了基本socket的跨平台通信框架.它支持异步访问,并支持tcp的自动封闭控制等操作. 一个简单的通信协议可以为: header body body长 数据 通过boos ...
- 使用 boost.asio 简单实现 异步Socket 通信
客户端: class IPCClient { public: IPCClient(); ~IPCClient(); bool run(); private: bool connect(); bool ...
随机推荐
- 【python爬虫】 request模块介绍 http协议版本区别 双token认证 携带cookie的两种方式 requests.session的使用 post请求携带数据编码格式 request.text编码问题 下载图片,视频
目录 上节回顾 今日内容 1 爬虫介绍 2 request模块介绍 3 request发送get请求 4 request携带参数 5 url编码解码 6 携带请求头 http协议版本之间的区别 7 发 ...
- Spring 学习笔记(3)控制反转 IoC
本篇文章主要对 Spring 框架中的核心功能之一控制反转 (IOC,Inversion of Control)进行介绍,采用理论 + 实战的方式给大家阐述其中的原理以及明确需要注意的地方. 控制反转 ...
- “n个球放到m个盒子”问题整理(Twelvefold way)
这个算法的正式名字是:"Twelvefold way",共用12种情况. 本文转载自:自为风月马前卒的博文:浅谈"n个球"和"m个盒子"之间 ...
- POJ - 3180 The Cow Prom ( korasaju 算法模板)
The Cow Prom POJ - 3180 题意: 奶牛圆舞:N头牛,M条有向绳子,能组成几个歌舞团(团内奶牛数 n >= 2)?要求顺时针逆时针都能带动舞团内所有牛. 分析: 所谓能带动, ...
- LeetCode75 颜色分类 (三路快排C++实现与应用)
三路快排是快速排序算法的升级版,用来处理有大量重复数据的数组. 主要思想是选取一个key,小于key的丢到左边,大于key的丢到右边,递归实现即可. 具体操作过程参考:https://blog.csd ...
- SpringBoot 配置类解析
本文首发于 vivo互联网技术 微信公众号链接:https://mp.weixin.qq.com/s/NvPO5-FWLiOlrsOf4wLaJA作者:Li Wanghong SpringBoot作为 ...
- 如何用 7 分钟击破 Serverless 落地难点?
当前,Serverless 覆盖的技术场景正在不断变广.Serverless 已在微服务.在线应用.事件驱动.任务处理等众多场景被验证且广泛应用 .当你想要部署一个网站时,需要自己购买服务器并花费时间 ...
- <vue 基础知识 7、循环遍历>
代码结构 一. 01-v-for遍历数组 1.效果 2.代码 01-v-for遍历数组.html <!DOCTYPE html> <html lang="en&qu ...
- package.json文件中版本号
"5.0.3"表示安装指定的5.0.3版本,"-5.0.3"表示安装5.0.X中最新的版本,"^5.0.3"表示安装5.X.X中最新的版本.
- 大数相乘 a*b
//zznu 1562//用数组模拟乘法计算的过程 #include<iostream> #include<stdio.h> #include<string.h> ...