多线程服务依赖于两个通用函数,首先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 多线程通信的更多相关文章

  1. 使用Boost.Asio编写通信程序

    摘要:本文通过形像而活泼的语言简单地介绍了Boost::asio库的使用,作为asio的一个入门介绍是非常合适的,可以给人一种新鲜的感觉,同时也能让体验到asio的主要内容. Boost.Asio是一 ...

  2. 如何在多线程leader-follower模式下正确的使用boost::asio。

    #include <assert.h> #include <signal.h> #include <unistd.h> #include <iostream& ...

  3. 使用Boost asio实现同步的TCP/IP通信

    可以先了解一下Boost asio基本概念,以下是Boost asio实现的同步TCP/IP通信: 服务器程序部分,如果想保留套接字之后继续通信,可以动态申请socket_type,保存指针,因为so ...

  4. 使用Boost asio实现异步的TCP/IP通信

    可以先了解一下Boost asio基本概念,以下是Boost asio实现的异步TCP/IP通信: 服务器: #include "stdafx.h" #include <io ...

  5. 浅谈 Boost.Asio 的多线程模型

    Boost.Asio 有两种支持多线程的方式,第一种方式比较简单:在多线程的场景下,每个线程都持有一个io_service,并且每个线程都调用各自的io_service的run()方法. 另一种支持多 ...

  6. <转>浅谈 Boost.Asio 的多线程模型

    本文转自:http://senlinzhan.github.io/2017/09/17/boost-asio/ Boost.Asio 有两种支持多线程的方式,第一种方式比较简单:在多线程的场景下,每个 ...

  7. (原创)如何使用boost.asio写一个简单的通信程序(一)

    boost.asio相信很多人听说过,作为一个跨平台的通信库,它的性能是很出色的,然而它却谈不上好用,里面有很多地方稍不注意就会出错,要正确的用好asio还是需要花一番精力去学习和实践的,本文将通过介 ...

  8. 通信有连接有消息队列选择boost.asio

    通信有连接有消息队列选择boost.asio 连接自主管理 消息队列自主管理

  9. socket通信框架——boost asio

    boost asio是一个封装了基本socket的跨平台通信框架.它支持异步访问,并支持tcp的自动封闭控制等操作. 一个简单的通信协议可以为: header body body长 数据 通过boos ...

  10. 使用 boost.asio 简单实现 异步Socket 通信

     客户端: class IPCClient { public: IPCClient(); ~IPCClient(); bool run(); private: bool connect(); bool ...

随机推荐

  1. 【HZERO】安全体系

    安全体系 https://open.hand-china.com/community/detail/521336056218521600#前言前言open&doc-0

  2. 一个NASA、Google都在用的开源CMS:wagtail

    说起开源CMS,你会想到哪些呢?WordPress?DoraCMS?joomla? 今天再给大家推荐一个非常好用的开源CMS:Wagtail 如果您正在选型的话,可以了解一下Wagtail的特点: 基 ...

  3. 【网络爬虫学习】Python 爬虫初步

    本系列基于 C语言中文网的 Python爬虫教程(从入门到精通)来进行学习的, 部分转载的文章内容仅作学习使用! 前言 网络爬虫又称网络蜘蛛.网络机器人,它是一种按照一定的规则自动浏览.检索网页信息的 ...

  4. 航拍倾斜摄影 Web 3D GIS 数字孪生智慧火电厂

    前言 7 月份,245 个国家气象站日最高气温突破 7 月历史极值:同时,疫情防控形势向好,企业加快复工达产节奏,电力负荷屡创新高.煤电作为我国最主要的电源,用不足 50% 的装机占比,生产了全国约 ...

  5. django的简单学习

    前言 以下项目实现基于一个投票系统 安装django 命令行安装 pip install django pycharm安装 pycharm的setting里找到这个,点击+号,搜索django 点击I ...

  6. Serverless 架构下的 AI 应用开发

    Serverless架构与CI/CD工具的结合 CI/CD 是一种通过在应用开发阶段引入自动化流程以频繁向客户交付应用的方法.如图所示,CI/CD 的核心概念是持续集成.持续交付和持续部署. 作为一个 ...

  7. 高级数据结构---B树和B+树及mysql索引分析

    mysql索引数据结构:https://www.cnblogs.com/nijunyang/p/11406688.html 几种树结构的对比: 二叉查找树:二叉搜索树,二叉排序树,优点查找快,但是在某 ...

  8. vue-cli3.x中public和assets的区别

    今天开发了一个html5视频播放功能. vedio.mp4资源放在public文件夹下.那vue-cli3.x中public和assets的区别 vue-cli3.0有两个放置静态资源的目录分别是pu ...

  9. 解决navicat连接mysql数据库查询很慢的问题

    1.背景: navicat连接数据库进行sql查询,每隔一段时间发现查询会变得很慢 2.原因: Mysql服务器端会定时清理长时间不活跃空闲的数据库连接,进行优化 3.解决方案: Navicat -右 ...

  10. GoLang 指针初探

    1. 内置类型和引用类型 Go 中内置类型包括数值类型,字符串类型和布尔类型.引用类型包括切片,映射,通道,接口和函数类型.其中,引用类型表示创建的变量包含一个指向底层数据结构的指针和一组管理底层数据 ...