2013-02-04 132 views
0

我很抱歉如果這個問題是其他類似問題的重複。選擇非阻塞套接字

我正在設置小型服務器 - 客戶端上的負載很少的系統(每次不超過10-15個連接,這也會做非常低的數據傳輸)。我想知道是否應該使用阻塞或非阻塞套接字?

在服務器端,我使用select,當它返回時,我去閱讀fds。現在,如果我使用非阻塞套接字選擇,那麼在select之後的「recv」中有什麼優勢。可以有一種情況,選擇告訴你有什麼可以閱讀,但實際上沒有什麼可讀的?

感謝

回答

3

我想知道我是否應該使用阻塞或非阻塞套接字?

對於這樣的低負荷時,我會使用阻止套接字,並給每個插座自己專用的線程來運行。話雖這麼說,select()作品阻塞和非阻塞套接字,如果你不舒服的多線程節目。

可以有一種情況,選擇告訴你有什麼可以閱讀,但實際上沒有什麼可讀?

是的。在優美的斷開連接上,select()報告一個套接字是可讀的,然後該套接字上的recv()返回0.

+0

我的意思是可以發生的情況是,對於阻塞套接字,選擇返回一個FD,當我打電話讀取它被阻止,因爲沒有什麼可讀的。 –

+0

是的,它可以,但只有當多個線程同時從同一個套接字讀取時纔可以。如果一個線程調用'recv()',另一個線程可以阻塞'recv()'。爲避免衝突,永遠不要讓多個線程從同一套接字讀取。 –

+0

gotcha !!!謝謝。 –

0

我同意@Remy。

但是,我建議你不要使用線程。至少不要開始。我建議這樣做的原因是因爲聽起來你對這種類型的東西有點新鮮感,並且線程可能只是爲了讓基本的通信啓動並運行而爲你添加更多的麻煩。

+0

所以你同意但你不同意?這是什麼? – EJP

+0

我同意。鑑於他似乎對此很陌生,我認爲線索只會增加他可以逃避的複雜因素。他也可以使用阻塞套接字選擇(正如Remy所述)。而且,fork()在這種情況下工作得很好(只要你不在windows上)。通常更容易掌握。 –