0

关于答案:Boost:Asio 的游戏服务器如何异步工作?

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

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

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

这种结构对我很有帮助:

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

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

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

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

4

2 回答 2

1

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

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

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

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

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

于 2012-08-15T13:37:12.693 回答
0

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

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

于 2012-08-14T13:03:28.033 回答