簡體   English   中英

在 C++ UDP 服務器中同時處理多個客戶端

[英]Handling multiple clients simultaneously in C++ UDP server

我開發了一個基於 C++ UDP 的服務器應用程序,我正在實現代碼以同時處理多個客戶端。 關於如何處理多個客戶並希望填補知識空白,我有以下理解

我的逐步理解如下所述

  1. UDP 服務器偵聽特定端口(例如 xxxx)
  2. 服務器有一個消息隊列。它可以是數組或鏈表或隊列或任何相關的東西
  3. 一旦請求到達 xxxx 端口,它就會被放入消息隊列中
  4. 將其放入消息隊列后,會生成一個新線程(我們稱之為工作線程),它會拾取排隊的消息,並將其從消息隊列中刪除
  5. 工作線程從消息 header 中了解客戶端 IP:port
  6. 工作線程處理請求並將響應發送給客戶端 IP:port
  7. 客戶端得到響應並且工作線程終止。

步驟 3 到 7 負責同時處理多個客戶端。 我的理解夠嗎? 我哪里需要改進? 提前致謝

客戶端得到響應並且工作線程終止。

工作線程應在完成處理后終止。 它沒有實用的方法來等待客戶端的確認。

工作線程處理請求並將響應發送給客戶端 IP:port

我認為將響應放在隊列中會更好。 主服務器線程可以檢查隊列並發送在那里找到的任何響應。 當兩個工作線程在嘗試發送響應時重疊時,這可以防止出現競爭情況。

服務器有一個消息隊列。它可以是數組或鏈表或隊列或任何相關的東西

它幾乎必須是一個隊列。 有趣的問題是什么隊列優先級。 最初 FIFO 會做。 如果您的服務器超載,那么您需要考慮替代方案。 也許最好估計所需的處理時間,然后先做快的。 或者也許不同的客戶應該有不同的優先級。

將其放入消息隊列后,將生成一個新線程(我們稱之為工作線程)

這最初很好。 但是,您將需要進行一些時間分析並確定線程池是否有優勢。

深入討論線程問題

作業處理必須在單獨的工作線程中完成,以便長時間作業不會阻止服務器接受來自其他客戶端的連接。 但是,您應該仔細考慮是否要使用多個工作線程。 由於您將作業請求放在隊列中,因此可以使用單個工作線程一個一個地處理它們。

PRO 單線程

  • 更簡單、更可靠的代碼。 處理代碼必須是線程安全的,以便上下文切換回主線程。 但是,作業處理代碼之間不會有任何上下文切換。 這使得設計和調試處理代碼變得更加容易。 例如,如果作業正在更新數據庫,那么您不需要任何額外的代碼來確保數據庫始終保持一致 - 只需在每個作業流程結束時保證一致性。

  • 對短期工作的響應更快。 如果同時提交了許多短作業,那么您的 CPU 可能會花費更多的周期在作業之間進行切換,而不是實際執行有用的處理。

CON單線程

  • 一個大工作會阻塞其他工作,直到它完成。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM