boost asio acceptor 构造

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

另外一种,如下:

 

 1 // 但是如果 想要将acc 对象的实例放到一个类中,该类的构造函数中对该acceptor 进行实例化,
 2 // 同时在构造函数中不进行监控操作,那么就需要上面的构造进行分解开来了。
 3 boost::asio::io_service io_svc;
 4 boost::asio::ip::tcp::acceptor  acc(io_svc);
 5 
 6 // 下面几步其实是将: boost::asio::ip::tcp::acceptor acc(io_svc, lis_ep) 拆解开来,分开调用。
 7 // 这样方便我们自己实现类对象的各步骤。
 8 boost::asio::ip::address_v4 lis_ip; // 默认监听本机所有IP
 9 boost::asio::ip::tcp::endpoint lis_ep(lis_ip, 20017);   // 监听端口: 20017
10 acc.open(lis_ep.protocol());
11 acc.bind(lis_ep);
12 acc.listen(0);
13 // 接下来就可以调用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 处理客户端的连接速度快很多。

 

转载于:https://www.cnblogs.com/suyunhong/p/7151491.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值