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. Codeforces #250 (Div. 2) B. The Child and Set

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u011639256/article/details/28100041 题读错了啊... 一直跪,但刚 ...

  2. 寻找链表倒数第k个元素,只遍历一遍(编程之美)

    class LNode { public LNode next; public int data; } /*找出倒数第k个元素,只遍历一遍*/ class Kk { private static LN ...

  3. strcoll - 用当前的区域选项来比较两个字符串

    总览 (SYNOPSIS) #include <string.h> int strcoll(const char *s1, const char *s2); 描述 (DESCRIPTION ...

  4. tar - tar 档案文件管理程序的 GNU 版本。

    总览 tar [ - ] A --catenate --concatenate | c --create | d --diff --compare | r --append | t --list | ...

  5. Shell: 文本文件操作

    文件显示和信息 wc wc 可以用于统计文件的行数和单词数. nl nl 在文件的每行内容前面加上行号. 基于行的操作 grep grep 用于筛选匹配特定字符的行. grep "Hello ...

  6. div::before一个能插入元素的选择器

    div::before一个能插入元素的选择器

  7. nginx自动切割日志脚本

    #!/bin/bash savepath_log='/data/logs' nglogs='/data/logs' mkdir -p $savepath_log/$(date +%Y)/$(date ...

  8. 避免 Java 代码中的“坏味道”

    1.需要 Map 的主键和取值时,应该迭代 entrySet() 当循环中只需要 Map 的主键时,迭代 keySet() 是正确的.但是,当需要主键和取值时,迭代 entrySet() 才是更高效的 ...

  9. js实现复制|剪切指定内容到粘贴板--clipboard

    这是著名开源项目 clipboard.js 的 README.md,里面讲解的更加详细,有兴趣的同学可以了解一下.项目地址:https://github.com/zenorocha/clipboard ...

  10. 关键字this super final static

    this关键字 1.this代表通过当前类实例化成的对象. 2.通过this来获取当前类的属性和方法 3.通过this和区分成员变量和局部变量 4.通过this(参数),调用当前类的构造方法 注意:通 ...