【发布时间】:2013-03-30 16:10:59
【问题描述】:
我有一个服务器类,它将启动两个线程,一个是接受所有传入的连接并将这些套接字放入一个向量中。另一种是扫描这个socket向量,找出哪个被读为读/写,然后做一些事情。
所以问题是在第二个线程(成员函数)中,我如何真正扫描那些套接字?
人们建议使用 unix socket 的 select(),但我决定在任何地方都使用 boost,所以我正在寻找 boost 中的解决方案。
我已经阅读了来自 boost.org 和这个站点的一些文档。人们说 io_service 是 select 的抽象。我不明白。我是否只是绑定函数/对象然后使用 io_service::post() 将它们放入队列并使用 io_service::run() 执行?
update,在我的理解中,每次你用一个包含io_service对象的构造函数实例化一个新的socket对象,这个socket对象就和io_service对象相关联,因为我只有一个io_service对象,这些socket对象会在什么时候被执行我调用 io_service.run()
但是,问题是,我如何将 handle_function 分配给那些套接字,我看到人们使用 acceptor.async_accept(socket, boost::bind(handler, &socket)) 像这样,但是我想用accept而不是async_accept(),但是accept()函数不能用来绑定handler函数到这个socket
我该怎么办?
class Server
{
io_service IOService;
std::vector<boost::....::socket> SocketVector;
listen()
{
//blockingly accept all incoming connection and bind socket with handler function;
}
process HandleRequest()
{
//io_service.run()
}
}
int main()
{
Server myServer;
boost::thread thread1(&Server::listen, &myServer);
boost::thread thread2(&Server::HandleRequest, &myServer);
}
【问题讨论】:
-
这当然不是答案,但似乎你走错路了:你已经“修复”了某些设计(线程、套接字轮询等),现在你'重新尝试将此方案“延伸”到
Boost.Asio。最后,你会得到一个不适合你选择的工具的糟糕设计。相反,值得仔细阅读Asio手册和相关资源 (blog.think-async.com) 并尝试“异步思考”。这样,您将获得可以利用 Asio 功能的更好的设计。 -
谢谢伊戈尔,我的设计是我有一个线程监听,一个线程从这些套接字中选择并处理它们。原因是客户端需要连接很长时间,但每隔几个请求就会发送一次。所以我不需要为每个连接使用一个线程,相反,我只需要一个用于所有连接的线程,因此我需要扫描这些套接字并找到哪个是可用的[io_service.run()]
-
我不知道我的设计好不好,请建议其他方法
-
您不需要“扫描”套接字,也不需要线程,除了运行主 asio 循环
io_service::run()的线程(尽管出于可伸缩性原因您可以使用线程)。使用异步(前摄器)方法,只要发生与 i/o 相关的事件,即当套接字被接受、数据到达等时,您就会通过完成处理程序得到通知。boost.org/doc/libs/1_53_0/doc/html/boost_asio/overview/core/… -
我试图理解。你的意思是如果我使用 async_accpet(Socket, boost::bind(&handler, &Socket)) 之后我只需调用 io_service.run() 就可以解决它?
标签: sockets select boost boost-asio