boost asio的几个小技巧。
2010-05-03 11:22
225 查看
平台: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的感觉还可以,上面只是我做为初学
者的一些感觉,高手一笑而过吧。
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的感觉还可以,上面只是我做为初学
者的一些感觉,高手一笑而过吧。
相关文章推荐
- Boost.Asio的使用技巧
- 【Boost】boost库asio详解8——几个TCP的简单例子
- boost asio 几个问题
- Boost.Asio的使用技巧
- Boost.Asio的使用技巧
- Boost.Asio的使用技巧
- Boost.Asio的使用技巧
- Boost-Asio的使用技巧
- 【Boost】boost库asio详解8——几个TCP的简单例子
- boost::asio发送与传输相关的几个函数,备忘
- Boost.Asio的使用技巧
- Boost.Asio的使用技巧
- Boost.Asio的使用技巧
- Eclipse的几个小技巧
- 几个linux 技巧
- boost asio 应用方法学——深入框架
- 制定计划的几个技巧
- boost asio死锁一例
- boost.asio 学习笔记04——asio的体系结构
- GridView的几个小技巧