提升 asio 服务器

Boost asio server

本文关键字:服务器 asio 提升      更新时间:2023-10-16

关于以下问题的答案:带有Boost:Asio的游戏服务器如何异步工作?

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

我的意思是,如果我正在编写一个http服务器,答案上的示例就足够了,因为发送的所有数据都是接收到的数据的功能。

假设我的程序计算值并需要根据客户的需求更新客户端(有些人可能想要更新频率 1 Hz,而另一个需要更新频率 10 Hz 等)。

这种结构对我非常有帮助:

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

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

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

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

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

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

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

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

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

您仍然可以使用异步接受和接收,但在需要时同步发送到客户端。

如果可以为每个连接的客户端使用

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