在 C++ UDP 服务器中同时处理多个客户端

Handling multiple clients simultaneously in C++ UDP server

我已经开发了一个基于 C++ UDP 的服务器应用程序,并且我正在实现同时处理多个客户端的代码。 我对如何处理多个客户有以下理解并希望填补知识空白

我的步骤理解如下

  1. UDP 服务器侦听特定端口(比如 xxxx)
  2. 服务器有一个消息队列。它可以是数组或链表或队列或任何与此相关的东西
  3. 一旦请求到达端口 xxxx,它就会被放入消息队列
  4. 将其放入消息队列后,会生成一个新线程(让我们称之为工作线程),它会拾取排队的消息并将其从消息队列中删除
  5. 工作线程从消息头
  6. 了解客户端IP:port
  7. 工作线程处理请求并将响应发送给客户端IP:port
  8. 客户端收到响应,工作线程终止。

第 3 步到第 7 步负责同时处理多个客户端。 我的理解是否足够?我哪里需要改进? 提前致谢

The clients gets the response and the worker thread terminates.

工作线程在完成处理后应该终止。没有实用的方法让它等待来自客户端的确认。

The worker thread processes the request and sends the response to the clients IP:port

我认为将响应放在队列中会更好。主服务器线程可以检查队列并发送在那里找到的任何响应。这可以防止两个工作线程在尝试发送响应时发生重叠。

The server has a message queue .It can be array or linked list or Queue or anything for that matter

它几乎必须是一个队列。有趣的问题是什么队列优先级。最初 FIFO 可以。如果您的服务器过载,那么您需要考虑替代方案。也许最好估计所需的处理时间,然后先处理快的。或者也许不同的客户应该得到不同的优先级。

After putting it in the message queue a new thread(let us call it worked thread) is spawned

一开始没问题。但是,您需要进行一些时间分析并确定线程池是否有利。

深入讨论线程问题

作业处理必须在单独的工作线程中完成,这样长时间的作业就不会阻止服务器接受来自其他客户端的连接。但是,您应该仔细考虑是否要使用多个工作线程。由于您将作业请求放在队列中,因此可以使用单个工作线程来一个一个地处理它们。

PRO单线程

  • 更简单、更可靠的代码。处理代码必须是线程安全的,以便上下文切换回主线程。但是,作业处理代码之间不会有任何上下文切换。这使得设计和调试处理代码变得更加容易。例如,如果作业正在更新数据库,那么您不需要任何额外的代码来确保数据库始终一致 - 只需在每个作业流程结束时保证一致性。

  • 更快地响应短期作业。如果同时提交了许多短作业,您的 CPU 可以花费比实际进行有用处理更多的周期在作业之间切换。

CON单线程

  • 大作业会阻塞其他作业,直到它完成。