boost asio的几个小技巧。

平台:win2k或者以上
1、投递多个accept请求
这个也是对应以前完成端口的投递若干个wsaaccept的
for(int index=0;index<32;index++)
{
HqSessionPtr new_connection(new HqSession(_io_service));
new_acceptor->async_accept(new_connection->socket(),
boost::bind(&HqSessionMgr::handle_accept, this,new_connection,new_acceptor,boost::asio::placeholders::error));
}
2、同时监听多个端口
g_ui_log->info("服务器启动,ThreadSize(%d)",_thread_pool_size);
for(std::set::iterator it=_listen_ports.begin();it!=_listen_ports.end();it++)
{
int curport=*it;
try
{
using boost::asio::ip::tcp;
tcp::endpoint endpoint(tcp::v4(),curport);
//这里是根据每个监听端口创个新的acceptor
boost::asio::ip::tcp::acceptor *new_acceptor=new boost::asio::ip::tcp::acceptor(_io_service,endpoint);
_acceptors.push_back(new_acceptor);
g_ui_log->info("开始监听端口:%d",curport);
for(int index=0;index<32;index++)
{
//这里是写死了投递32个,也可以从配置文件读入。
HqSessionPtr new_connection(new HqSession(_io_service));
new_acceptor->async_accept(new_connection->socket(),
boost::bind(&HqSessionMgr::handle_accept, this,new_connection,new_acceptor,boost::asio::placeholders::error));
}
}
catch(...)
{
g_ui_log->info("监听端口失败:%d",curport);
}
}
这边是对每个端口进行投递
3、 每个session同时只有同一个线程里处理。
这个具体用strand估计大家都知道了。
这种做法有别于以前的用锁来实现,这样做了后就 可以不用锁,而且处理线程不用等待。
我只稍微说一下原理。
原理是这样的,每次读,写请求其实都是一个类似函数指针的东东,strand就 是维护着一个列表,每个读写请求来了后会看这个session是否有正在处理的请求,如果有的话就直接丢列表,
每次处理的请求完毕后,会看列表里 是否有请求,如果有的话,把这个直接重新post到io_service里去。

用boost.asio的感觉还可以,上面只是我做为初学 者的一些感觉,高手一笑而过吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值