【问题标题】:single thread server in BoostBoost 中的单线程服务器
【发布时间】: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


【解决方案1】:

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

我建议重新考虑您的设计并将其基于异步操作。研究包含在 asio 文档中的 the examples标签里也有很多信息。

【讨论】:

    猜你喜欢
    • 2014-11-12
    • 1970-01-01
    • 2021-03-06
    • 1970-01-01
    • 1970-01-01
    • 2012-06-26
    • 2011-06-09
    • 2011-03-16
    • 1970-01-01
    相关资源
    最近更新 更多