2011-12-14 55 views
1

我正在寫一個套接字服務器,旨在只承載少量的客戶端連接。如何防止在服務器完成時敲擊套接字服務器?

當用戶嘗試連接時,我的服務器可以做兩兩件事之一,AFAICT:

  1. 接受()傳入的套接字連接,告知該服務器是滿的,然後關閉用戶()的連接;
  2. 如果連接列表已滿,只需忽略嘗試連接。

我真的不喜歡第二種選擇,但在我看來,第一個引起麻煩,其中玩家(因爲這是一個遊戲)可能會嘗試錘擊服務器。而如果我簡單地忽略這些嘗試,在這方面就不會有任何問題。

我應該採取什麼方法?

回答

2

的數量。

如果服務器不是一個(或多個)程序,它會像瘋了似地打開大量的並行連接並且真正嘗試,那麼錘子不會取下服務器。

讓用戶點擊一個按鈕進行連接,如果服務器已滿,等待一秒鐘(或更多),然後讓玩家重試,這樣客戶端(玩家)就會開心(他可以控制)而且他不會像每秒一次地敲打更多的東西(而且無論如何,誰將會手動打坐並手動敲打幾個小時)。

2

您可以爲傳入連接保留一個隊列,並根據您決定設置的連接池接受()只有少數隊列。也就是說,您可以決定一次接受5個連接,並將隊列中的剩餘輸入連接保存在隊列中,並根據您當前的狀態進行操作 - 一旦您有空閒連接,就接受來自第三方的連接隊列。

+1

不......這個實用程序很少。在告訴他們稍後再試,或者直接忽略它們後,彈出客戶端更容易。事實上,你所倡導的與我的選擇2大致相同,因爲直到一個插槽變得可用時,它們纔會得到任何迴應。 「我忽視街上討厭的人,還是我禮貌地告訴他們讓我一個人呆着?」問題是承認會帶來更多的麻煩而不是價值。 –

+0

使用傳入連接池是解決類似問題的常用方法。 – Shai

+0

您可能會更容易「在讓他們稍後再試一次後退出客戶」,但對他們來說這是一個主要障礙。當連接到一個遊戲時,我寧願知道我在排隊,並且最終會建立連接(我甚至可以根據我在隊列中的位置來估計),而不是被告知稍後再試一次(多少以後?一分鐘?十分鐘?一小時?我有保證,以後我可以連接嗎?或者我將不得不一次又一次地嘗試沒有結果?我可能會很快生氣並去玩一些其他遊戲)。 –

0

第三種選擇:使用iptables來限制我想說通知客戶傳入連接

+0

這款遊戲服務器可以託管在任何用戶的機器上。我不確定iptables在這裏甚至是遠程適用的。 –