c++ - 网络应用程序有多少传入缓冲区?

标签 c++ linux multithreading networking

我正在编写一个从多个客户端接收数据的网络应用程序:当收到一个数据包时,应用程序读取并修改 header ,然后将数据包转发给一个或多个客户端。我想为与客户端的每个连接使用一个输出队列,因此应用程序能够监视每个输出队列的填充水平并检测每个客户端上的负载。

传入数据包的路由可以由单个线程实现,它应该分析每个数据包的 header 以确定目标客户端:该线程还访问路由表以正确转发数据包。

如何处理传入的消息? 我可以为每个连接使用一个共享队列或一个输入队列:

  1. 如果我使用单个共享队列,路由线程和处理客户端连接的线程将同时访问它;
  2. 如果我为每个输入连接使用一个输入队列,路由线程和处理来自客户端的连接的唯一线程将同时访问它。

在第一种情况下,路由线程的作用相当简单,因为它只应从队列中取出下一个数据包并将其转发给另一个客户端。相反,在第二种情况下,路由线程应该一个接一个地检查所有输入队列。第二种方法的优点是可以避免最快的连接填满共享队列,从而增加其他连接发现队列已满的可能性。

第二种方法要求路由线程应遵循确保与输入队列相关的公平行为的策略。在这种情况下可以使用什么策略?

此外,还有哪些其他原因可能导致人们选择第一种或第二种解决方案?两种解决方案的优缺点是什么?

最佳答案

The routing of incoming packets could be achieved by a single thread

为什么要有线程?为什么不使用一个方法,由接收线程调用,将结果消息放入目标客户端的写入队列中?

关于c++ - 网络应用程序有多少传入缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17332016/

相关文章:

c++ - 如何使用 QT、OpenGL、C++ 和 Linux 更改屏幕分辨率?

linux - 遍历结构页面

multithreading - 增加CFML中线程的请求超时

multithreading - 从工作线程崩溃中创建 NSWindow?

c++ - 如何将应用程序的基本优先级动态设置为 31?

c++ - GCC - 具有相同名称的不同类的错误

c++ - 为什么在将字符串类型转换为 DWORD 时在运行时得到不同的值?

Python 不写出来

C# 缓冲 GZipStream 压缩

c++ - 有没有办法让 OpenCL C++ 绑定(bind)对所有错误都抛出异常?