2012-01-27 60 views
3

服務器需要偵聽來自多個套接字(10-20)的傳入數據。在一些初始化之後,這些套接字被創建並且不會改變(即,不接受新的套接字,並且在服務器的生命週期中它們都不會關閉)。偵聽多個套接字:選擇與多線程

一個選項是select()在所有套接字上,然後處理每個套接字的傳入數據(即路由到正確的處理函數)。

另一種選擇是每個套接字打開一個線程並讓每個線程recv()和處理輸入。

(第一個選項有設置超時的好處,但在這種情況下這不是問題,因爲所有套接字都非常活躍,所以這不是問題, )。

假設如下:Windows服務器,有足夠的內存,20MB(對於20個線程)是一個非問題,這些選項中的任何一個預計會比另一個快嗎?

+4

我認爲使用10-20個套接字,爲每個套接字分配一個線程並不是問題,使用'recv()'處理通常比編程(afaik)要快一些。另請參閱本討論以獲取更多意見:http://www.gamedev.net/topic/304030-async-sockets-or-select-with-threads/ – 2012-01-27 21:25:34

回答

2

在你的應用程序中沒有太多內容。通常,使用每個套接字線程比異步方法更容易,因爲它是一個更簡單的整體結構,並且更容易維護狀態。

+0

此外,網絡的速度不受此選擇的影響。這是關於CPU和內存效率的選擇。 – usr 2013-09-19 10:12:52