Boost中的单线程服务器

时间:2013-04-08 14:15:07

标签: sockets select boost boost-asio

我有一个服务器类,将启动两个线程,一个是接受所有传入连接并将这些套接字放入一个向量中。另一个是扫描这个套接字向量,找出哪个是读/写然后做的。

所以问题是在第二个线程(成员函数)中,我该如何实际扫描这些套接字?

人们建议使用unix套接字的select(),但我决定在任何地方都使用boost,所以我在寻找解决方案。

我已经阅读了来自boost.org和本网站的一些文档。人们说io_service是select的摘要。我不明白。我只是绑定函数/对象然后使用io_service :: post()将它们放入队列并使用io_service :: run()来执行吗?


更新,据我所知,每次使用包含io_service对象的构造函数实例化一个新的套接字对象时,这个套接字对象都与io_service对象关联,因为我只有一个io_service对象,这些套接字对象将在执行时执行我叫io_service.run()

但问题是,如何将handle_function分配给那些套接字,我看到人们使用 acceptor.async_accept(socket,boost :: bind(handler,& socket))就像这样,但是我想使用accept而不是async_accept(),但是accept()函数不能用于将处理函数绑定到这个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);
}

1 个答案:

答案 0 :(得分:0)

您的设计听起来过于复杂,可能无法与Boost Asio很好地融合。是的,你可以为每个套接字使用一个线程,但是当有多个并发连接时,falls apart quickly。{/ p>

我建议您重新考虑您的设计并将其基于异步操作。研究asio文档中包含的the examples标记中还有大量信息。