【问题标题】:Boost asio server提升 asio 服务器
【发布时间】:2012-08-14 12:58:18
【问题描述】:

关于答案:How game servers with Boost:Asio work asynchronously?

如果我有一台服务器进行计算并同时发送/接收来自客户端的数据包怎么办?

我的意思是,如果我正在编写一个 http-server,那么答案中的示例就足够了,因为发送的所有数据都是接收到的数据的函数。

假设我的程序计算值并需要根据客户的需要更新客户端(有些可能希望更新频率为 1 赫兹,而另一种为 10 赫兹等)。

这种结构对我很有帮助:

while(1){
pollNetworking(); //<- my function
value1 += 5; value2 = random();
}

在我的 pollNetworking 函数中,我正在考虑调用诸如 acceptor.accept(*socket,10); 之类的东西。其中 10 是以毫秒为单位的超时,但由于没有超时参数,我不知道如何构造它。

可扩展性不是最大的问题,我可以为每个套接字生成一个线程,一个额外的线程用于接受,另一个线程用于计算吗?这很容易实现吗?因为我希望它尽可能稳定,然后是速度,然后是可扩展性。当谈到多线程时,我不相信自己可以干净地编码和调试它。

编辑:我了解到我可以使用 io_service::poll,它只调度就绪事件而不阻塞。所以它是一个 0 超时的同步函数,完全符合我的需要。

【问题讨论】:

    标签: c++ boost boost-asio


    【解决方案1】:

    服务器可以在从客户端发送和接收数据的同时进行计算。但是,可能需要保护缓冲区和套接字免受并发访问。

    对于大多数 Boost.Asio 操作,可移植的超时功能仅适用于异步操作。这需要对实体发出异步操作,设置计时器,然后等待。有关超时取消async_read 的示例,请参阅this 问题。

    最简单且可扩展性较差的方法是为每个职责指定一个线程(每个套接字的线程、接受和计算)。可能需要进行同步,例如保护计算结果。例如,如果value1value2 只在同一次迭代中有意义,那么套接字线程需要保证这些值是一起写入的,而计算线程不会在写入过程中更改值。可以使用各种同步结构,例如Boost.Thread 提供的那些,来实现这一点。此外,通过最大限度地减少异步调用的使用量,可能更容易实现和调试。

    对于一个可扩展的方法,大部分程序将被编写为一系列从异步操作调用的处理程序。这允许程序更容易地利用线程和线程池。但是,它可以将程序逻辑分散到众多功能中,并且很快就会变得难以遵循。通常,考虑到异步操作编写的程序将与boost::asio::strand 执行同步,并通过boost::shared_ptr 管理对象生命周期。

    实施的难易程度取决于经验。请记住,网络编程、并发和异步操作天生就很困难。很少有既简单又完整的解决方案。

    【讨论】:

      【解决方案2】:

      您仍然可以进行异步接收和接收,但在需要发送给客户端时同步发送给客户端。

      如果您可以为每个连接的客户端使用单独的线程(我猜您不会期望有数百或数千个连接),那么您可以为每个连接的客户端使用一个线程进行计算和发送,同时保持接收异步.

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-06-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多