簡體   English   中英

套接字編程數據服務器

[英]Socket Programming Data Server

我正在用C ++為Linux中的數據服務器編寫代碼。 我有一個用於所有訂戶連接的文件描述符形式的套接字列表。 我的服務器需要不斷向訂戶發送數據。 我的最大訂閱人數約為100到200。 同時將數據推送到所有訂戶的最快方法是什么? 我需要數據盡快到達訂閱者。 我在考慮一些異步方法,但不確定應該如何實現。 我應該只調用系統異步方法嗎? 還是應該創建多個線程來處理每個訂戶? 還是應該實現某種線程池?

謝謝。

這可能在很大程度上取決於您的系統(單CPU?)和工作負載(是IO綁定,內存綁定還是CPU綁定?)。 因此,您最好的選擇是實施一些東西並對其進行基准測試。 如果您想利用多個處理器,並且主要受CPU限制,那么擁有一個小的線程池(但每個連接都不一個)是一個好主意。 如果您受內存限制,並且保持較小的內存占用很重要,那么最好使用單個線程。 如果您受IO的約束,那么請執行最容易實現的事情,因為這不會對宏大的計划產生任何影響,但是您的時間仍然很寶貴。

為了獲得創紀錄的boost :: asio,它是一種使用C ++進行異步通信的不錯的,可移植的方法。

同樣,這個問題還不是很清楚,但是在這里多播可能是合適的,這將使幾乎所有的網絡開銷都移出服務器。 如果您要發送給所有訂戶的數據相同,那么值得一看。

我不太了解Linux,但是每個連接都不使用一個線程。 使用任何允許您以事件驅動(回調)方式處理讀/寫結果的異步方法(如果存在)。

W. Richard Stevens(經典書籍)的“ Unix環境中的高級編程”描述了在多個文件描述符之間進行復用的高級IO的方法(第396頁的12.5.1節)。 是的,我面前有本書。 :)

我認為有兩種方法可以做到這一點:

  1. 分配線程池並委托每個線程要處理的n個文件描述符。
  2. 使用select和poll系統調用,使用異步IO在單個進程中完成所有這些操作。

現在,這取決於您要向客戶端推送多少數據。 我建議先使用選項2,然后再探索1(如果2不滿意)。

校驗

epoll
用於復用。 這比select更為先進,並且select的許多缺點已得到解決。

暫無
暫無

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

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