繁体   English   中英

Boost Asio服务器

[英]Boost asio server

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

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

我的意思是,如果我正在对http服务器进行编码,则答案示例就足够了,因为所有发送的数据都是接收到的数据的函数。

假设我的程序计算值并需要根据客户端的需求进行更新(有些客户端可能希望更新频率为1 hz,而其他频率则为10 hz等)。

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

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

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

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

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

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

对于大多数Boost.Asio操作,仅在异步操作上才可以使用便携式超时功能。 这要求在实体上发出异步操作,设置计时器,然后等待。 对于取消的例子async_read以超时,看到这个问题。

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

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

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

您仍然可以异步接收和接收,但是每当需要发送给客户端时,同步发送给客户端。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM