Boost中的单线程服务器



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

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

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

我从boost.org和这个网站上读了一些文档。人们说io_service是抽象的选择。我不明白。我只是绑定函数/对象,然后使用io_service::post()将它们放入队列并使用io_service::run()执行?


更新,在我的理解中,每次你用包含io_service对象的构造函数实例化一个新的套接字对象时,这个套接字对象与io_service对象相关联,因为我只有一个io_service对象,当我调用io_service.run()

时,这些套接字对象将被执行

但是,问题是,我如何将handle_function分配给那些套接字,我看到人们使用受体。async_accept(socket, boost::bind(&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);
}

您的设计听起来过于复杂,可能无法很好地与Boost Asio集成。是的,你可以为每个套接字使用一个线程,但当并发连接数量超过几个时,这种方法很快就会失效。

我建议重新考虑你的设计,并围绕异步操作。学习asio文档中包含的示例。在boost-asio标签中也有大量的信息

最新更新