boost::asio::io_service io_svc;
boost::asio::ip::address_v4 lis_ip; // 默认监听本机所有IP
boost::asio::ip::tcp::endpoint lis_ep(lis_ip, ); // 监听端口: 20017
// 一般情况构造acceptor 是按下面的方法进行构造
boost::asio::ip::tcp::acceptor acc(io_svc, lis_ep);
// 然后就可以直接使用acc 对象调用acc.async_accept(...) 函数了。

另外一种,如下:

 // 但是如果 想要将acc 对象的实例放到一个类中,该类的构造函数中对该acceptor 进行实例化,
// 同时在构造函数中不进行监控操作,那么就需要上面的构造进行分解开来了。
boost::asio::io_service io_svc;
boost::asio::ip::tcp::acceptor acc(io_svc); // 下面几步其实是将: boost::asio::ip::tcp::acceptor acc(io_svc, lis_ep) 拆解开来,分开调用。
// 这样方便我们自己实现类对象的各步骤。
boost::asio::ip::address_v4 lis_ip; // 默认监听本机所有IP
boost::asio::ip::tcp::endpoint lis_ep(lis_ip, ); // 监听端口: 20017
acc.open(lis_ep.protocol());
acc.bind(lis_ep);
acc.listen();
// 接下来就可以调用acc.async_accept(...) 函数了。

提示:boost::asio::ip::tcp::acceptor 是没有空参构造函数的。

一大问题:

刚刚发现,将acceptor 的构造拆分成多个函数调用与直接使用构造函数进行构造对客户端的连接处理不同,而且效率差别很大。

具体场景为:

  服务器:一个io_service 开10个线程,并发5个acceptor.async_wait() 调用。所有连接的所有处理全是调用异步函数。

  客户端:一个io_service 开5个线程,直接循环50个async_connect(),没有任何sleep。客户端每次去仅仅的发送一个消息,马上就断开连接。

现象:

  1、服务器使用上面说到的第一种方式进行构造acceptor (即:直接构造),这时50个连接都能被服务器正常处理。客户端将个数调整到500 个可以350 个以上的连接;

  2、服务器使用第二种方式进行构造acceptor (即:分成多个步骤),这时这50个连接有20个左右未能成功连接上服务器。

暂时得到的结论是:使用第一种方式进行构造acceptor  比第二种方式进行构造accpetor 处理客户端的连接速度快很多。

boost asio acceptor 构造的更多相关文章

  1. cpprestsdk同时使用boost.asio,acceptor就一直报Invalid argument。

    本文目录,首先总结问题,然后案例还原. 总结: 问题的根本在于boost.asio作为header-only库,运行程序与动态库之间容易因为版本错配而产生运行期莫名其妙的问题. cpprestsdk使 ...

  2. boost asio tcp server 拆分

    从官方给出的示例中对于 boost::asio::ip::tcp::acceptor 类的使用,是直接使用构造函数进行构造对象,这一种方法用来学习是一个不错的方式. 但是要用它来做项目却是不能够满足我 ...

  3. boost::asio译文

        Christopher Kohlhoff Copyright © 2003-2012 Christopher M. Kohlhoff 以Boost1.0的软件授权进行发布(见附带的LICENS ...

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

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

  5. boost asio io_service学习笔记

    构造函数 构造函数的主要动作就是调用CreateIoCompletionPort创建了一个初始iocp. Dispatch和post的区别 Post一定是PostQueuedCompletionSta ...

  6. boost ASIO实例

    client端代码 #include <iostream> #include <boost/asio.hpp> #include <boost/bind.hpp> ...

  7. Boost.Asio技术文档

    Christopher Kohlhoff Copyright © 2003-2012 Christopher M. Kohlhoff 以Boost1.0的软件授权进行发布(见附带的LICENSE_1_ ...

  8. boost.asio源码阅读(1) - 从chat_server开始

    1. 关于示例代码 chat 先从简单的入手, 在如下路径:boost_1_63_0/libs/asio/example/cpp11/chat中找到chat_server.cpp 查看其成员, pri ...

  9. Boost.Asio 网络编程([译]Boost.Asio基本原理)

    转自:https://m.w3cschool.cn/nlzbw/nlzbw-3vs825ya.html Boost.Asio基本原理 这一章涵盖了使用Boost.Asio时必须知道的一些事情.我们也将 ...

随机推荐

  1. android中的文件存储

    Context类中提供的IO方法: FileOutputSream openFileOutput(String name, int mode):打开应用程序中的/data/data/<应用程序的 ...

  2. javafx将数据库内容输出到tableview表格

    一 .创建Fxml文件,用Javafx Scene Builder 编辑页面,创建tableview(表格)和tablecolum(表格中的列),并为其设置fxid: 二.生成fxml文件的控制类: ...

  3. MOS管知识大集

    MOS管 增强型:就是UGS=0V时漏源极之间没有导电沟道,只有当UGS>开启电压(N沟道)或UGS<开启电压(P沟道)才可能出现导电沟道.耗尽型:就是UGS=0V时,漏源极之间存在导电沟 ...

  4. Grep的过滤使用

    grep的过滤使用 已知文件test里有以下内容 [root@yangwenbo /]# cat test yuni yunwei YUNWEI YWEI yunjijsuan yunsuan YUN ...

  5. 【LeetCode】Hash

    [451] Sort Characters By Frequency [Medium] 给一个字符串,要求返回按照字母出现频率的排序后的字符串.(哈希表+桶排) 有个技巧是Hash用Value作为In ...

  6. (PASS)break 和 continue 的区别

    1  break;  while循环中,break是用于永久终止循环.即不执行本次循环中break后面的语句,直接跳出循环. 终止,跳出,结束循环(可以作用在任何地方).也常与switch分支结构合用 ...

  7. new和delete,p150

    创建对象,不带()的称为不提供显式初始化,()为空的称为值初始化. 内置类型和没定义默认ctor的类型,不带()未初始化,带()初始化为0.但有默认构造函数的,带不带()都是利用默认构造函数初始化. ...

  8. 【错误总结】Component template should contain exactly one root element. If you are using v-if on multiple elements, use v-else-if to chain them instead.

    大致意思是因为模板里面应该包含一个根元素,使用组件的时候应该用div或p标签包起来

  9. php文件锁阻塞模式和非阻塞模式

    1.阻塞模式(如果其它进程已经加锁文件,当前进程会等其它进程解锁后继续执行) <?php $handle = fopen('lock.txt', 'r'); //锁定 if(flock($han ...

  10. leetcode-163周赛-1260-二维网格迁移

    题目描述: 自己的提交: class Solution: def shiftGrid(self, grid: List[List[int]], k: int) -> List[List[int] ...