现在的位置: 首页 > 综合 > 正文

boost asio的几个小技巧。

2013年12月03日 ⁄ 综合 ⁄ 共 1342字 ⁄ 字号 评论关闭

平台: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的感觉还可以,上面只是我做为初学
者的一些感觉,高手一笑而过吧。

抱歉!评论已关闭.