2010-11-03 100 views
2

我在C++中为Linux中的数据服务器编写代码。我有一个所有用户连接的文件描述符形式的套接字列表。我的服务器需要不断地向用户发送数据。我最多有100到200位用户。向所有用户同时推送数据的最快方式是什么?我需要数据尽快到达用户。我正在考虑一些异步方法,但不知道我应该如何实现这一点。我应该只是调用系统异步方法吗?或者我应该创建多个线程来处理每个用户?或者我应该实现某种线程池?套接字编程数据服务器

谢谢。

回答

2

我不太了解Linux但是不需要每个连接使用一个线程。使用任何异步方法都可以让您以事件驱动(回调)方式处理读/写结果(如果存在)。

+0

谢谢史蒂夫。在这种情况下,我的系统的延迟更重要。我需要数据尽快到达用户。那么当我选择采用哪种方法时,我应该测量哪些变量? – Steveng 2010-11-03 15:54:31

+1

设置一个“回声”测试,其中服务器反弹收到的数据包。测量不同负载和数据包大小下的平均往返数据包延迟(显然适合您的要求)。 – 2010-11-03 15:55:48

3

它可能很大程度上取决于您的系统(单个CPU?)和工作负载(是IO绑定,内存绑定还是CPU绑定?)。因此,您最好的选择是实施一些东西并进行基准测试。如果你想利用多个处理器,并且你大多是CPU绑定的,那么有一个小的线程池(但不是每个连接一个)是一个好主意。如果你是内存绑定,并保持内存占用小是重要的,那么可能使用单线程是一个好主意。如果你受到IO的限制,你可以做任何最容易实现的事情,因为它不会对事物的宏伟计划产生任何影响,但是你的时间仍然很有价值。

备案boost::asio是一个很好的,可移植的方式在C++中执行异步通信。

此外,这个问题并不完全清楚,但多播可能适合在这里,这将几乎所有的网络开销转移到服务器。假设它与发送给所有订户的数据相同,这非常值得关注。

+0

+1 for Boost参考 – 2010-11-03 15:34:21

+1

ASIO是一个不错的选择。 Boost非常棒,但你不需要它用于ASIO。 [Mordor](http://code.mozy.com/projects/mordor/)也看起来很有前途,但我还没有机会使用它。 – 2010-11-03 15:38:01

+0

这看起来很有趣,我会把它放在我的“图书馆测试”列表上,谢谢! – Flexo 2010-11-03 15:38:53

0

W. Richard Stevens(经典书籍)中的“Unix环境下的高级编程”描述了通过在多个文件描述符之间进行多路复用来执行高级IO的方法(第396页上的第12.5.1节)。是的,我把书放在了我的面前。 :)

我认为有2种方式这样做的:

  1. 分配一个线程池,并委派N文件描述由每个线程处理。
  2. 在使用select和poll系统调用的异步IO的单个进程中完成所有这些操作。

现在,这取决于您要将多少数据推送到客户端。我建议先选择2,然后探索1,如果2不满足。

0

检查

epoll
复用。这比select更先进,并且select中有很多缺点。