Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
套接字编程数据服务器 我在Linux中为C++的数据服务器编写C++代码。我有一个文件描述符形式的套接字列表,用于所有订户连接。我的服务器需要连续向订阅服务器发送数据。我最多有100到200个订户。同时向所有订户推送数据的最快方式是什么?我需要数据尽快到达订户。我正在考虑一些异步方法,但不确定应该如何实现。我应该调用系统异步方法吗?或者我应该创建多个线程来处理每个订阅服务器?还是应该实现某种线程池_C++_Linux_Sockets - Fatal编程技术网

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

套接字编程数据服务器 我在Linux中为C++的数据服务器编写C++代码。我有一个文件描述符形式的套接字列表,用于所有订户连接。我的服务器需要连续向订阅服务器发送数据。我最多有100到200个订户。同时向所有订户推送数据的最快方式是什么?我需要数据尽快到达订户。我正在考虑一些异步方法,但不确定应该如何实现。我应该调用系统异步方法吗?或者我应该创建多个线程来处理每个订阅服务器?还是应该实现某种线程池,c++,linux,sockets,C++,Linux,Sockets,谢谢。我对Linux不太了解,但是不要每次连接使用一个线程。使用允许您以事件驱动(回调)方式处理读/写结果的任何异步方法(如果存在)。这可能在很大程度上取决于您的系统(单CPU?)和工作负载(是IO限制、内存限制还是CPU限制?)。因此,您最好的选择是实现某些东西并对其进行基准测试。如果您想利用多个处理器,并且大部分CPU受限,那么拥有一个小线程池(但不是每个连接一个)是一个好主意。如果内存有限,保持内存占用很重要,那么使用单个线程可能是一个好主意。如果你是IO绑定的,做任何对你来说最容易实现的

谢谢。

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

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

< P>用于记录C++中异步调用的一种很好的、可移植的方式。p> 问题还不完全清楚,但多播在这里可能是合适的,这将转移服务器上几乎所有的网络开销。如果发送给所有订阅者的数据相同,这将非常值得一看。

W.Richard Stevens的“Unix环境中的高级编程”(经典著作)介绍了在多个文件描述符之间进行多路复用的高级IO方法(第396页第12.5.1节)。是的,我面前有本书。:)

我认为有两种方法可以做到这一点:

  • 为每个线程分配一个线程池和要处理的委托n个文件描述符
  • 使用异步IO,使用select和poll系统调用,在单个进程中执行所有这些操作

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

    检查epoll的多路复用。这比select先进得多,select的许多缺点都已在其中涵盖。

    ASIO是一个不错的选择。Boost很好,但ASIO不需要它。看起来也很有希望,但我还没有机会使用它。看起来确实很有趣,我会把它放在我的“要测试的库”列表中,谢谢!谢谢你的回复。实际上我已经试过测试Boost::Asio。我想我测量了异步写入的每个调用大约是10微秒。但是,系统对Linux::send的调用只需7微秒。我想知道我在这里做错了什么,因为它似乎没有意义,因为异步写入比Linux中的同步写入慢。有人对此有经验吗?@Steveng-你应该比较峰值和可持续的I/O吞吐量,而不是调用API的时间。如果数据需要可靠发送,多播将不会有多大帮助。谢谢Steve。在这种情况下,系统的延迟更为重要。我需要数据尽快到达订户。那么,当我选择采用哪种方法时,我应该测量哪些变量呢?设置一个“echo”测试,服务器在其中回退接收到的数据包。测量不同负载和数据包大小下的平均往返数据包延迟(以明显满足您的要求)。 epoll