CSDN博客

img sevencat

boost asio的几个小技巧。

发表于2010/5/3 11:22:00  2505人阅读

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

0 0

相关博文

我的热门文章

img
取 消
img