2012-12-27 27 views
4

因爲我閱讀了大量的文本和代碼有關套接字編程我決定去這樣的:手柄端緩衝器

TCP服務器:

  • 插槽復
  • asynchronious I/O

我希望能夠同時處理800-1200個客戶端連接。我如何處理客戶端緩衝區?我讀過的每一個例子都只有一個緩衝區。你爲什麼不人使用類似:

typedef struct my_socket_tag { 
    socket sock; 
    char* buffer; 
} client_data; 

現在我能夠給緩衝從接收線程客場調度請求線程和接收可以去另一座同時第一客戶特定緩衝區被處理。

這是常見的做法嗎?我錯過了這一點嗎?

請提供一些提示,下次如何改進我的問題,謝謝!

+2

沒什麼說,例如是一些時間錯誤,設計是簡單的,因爲它是一個例子... 使用一個結構從堆中分配或從一個靜態數組(固定大小其爲獲得等於最大數量connexion)是一個好主意 – benjarobin

回答

2

這些例子通常過於簡單。可伸縮性是一個嚴重的問題,我建議最好從簡單的應用程序開始;處理數千個客戶端連接是可能的,但在大多數應用中需要相當謹慎的開發。套接字編程可能會變得棘手。

有不同種類的服務器應用程序;沒有一種方法可以完美地適應所有任務。有很多細節需要考慮(是面向流或面向數據報的服務?是連接,如果有的話,是否持久?是否涉及大量的小數據傳輸,或者很少的巨量傳輸,或者大量的大量傳輸?Et cetera,等等)。這就是爲什麼你不可能在書中看到任何常見的例子。

如果您選擇線程方式,請注意不要創建太多的線程;每個客戶端一個線程通常(但並非總是)是不好的選擇。在某些情況下,甚至可以在單個線程(使用異步IO)中處理所有內容而不犧牲任何性能。

話雖如此,我會推薦學習C++和boost asio(或類似的框架)。它處理許多與可伸縮性有關的問題,所以重新發明輪子沒有意義。

你可以學習開源應用程序體系結構書(freely available)。有相當多的相關示例可能會對您有所幫助。

+0

首先感謝你的書的鏈接。我還沒有聽說過。 – stackofervlow