2010-10-17 107 views
1

我正在製作多人聯網遊戲。現在連接到服務器,客戶端需要服務器的IP地址。用於自動搜索服務器的UDP廣播

所以,我執行這個的方式如下。

客戶在廣播IP廣播其IP地址和端口說A. 服務器通過聽它,

服務器通過端口B.創建與客戶端表現爲一個客戶端一個新的UDP連接說它發送遊戲所需的所有重要信息,包括其IP。

Client是此連接的服務器和通過端口B.從服務器接收數據

現在,A和B是常數。因此,當我需要服務器偵聽不同線程中的多個客戶端時,我可以爲線程放置A和B的差異值,但在客戶端文件A和B中則獨立於這些線程。所以,它給我的

bind: Address already in use

一個錯誤,這是什麼的合理的解決方案?

回答

4

首先,讓客戶端廣播它的地址聽起來非常可怕,至少對我來說。廣播意味着它只能在服務器位於本地子網的情況下才能正常工作,並且會造成大量不必要的流量對網絡造成污染。

我希望客戶端通過DNS服務發現(DNS-SD)找到服務器。這具有如下優點:只要您的服務器位於本地子網上,就可以使用multicast DNS,並且使用正常的受管理DNS過渡到廣域服務器,而根本不需要對客戶端進行任何更改。

二,服務器應該而不是專用線程給每個客戶端。雖然這個型號可以使在某種程度上工作,但它有相當多的開銷和縮放比例很差。

最後,(我認爲是)你的原始問題:而不是每個客戶端的不同端口,我會爲所有客戶端提供一個端口。來自客戶端的每個請求將攜帶足夠的信息,以供服務器執行其包含的任何請求。服務器只是監聽其單個端口,並在每個請求到達時提供服務。您可能會將多個線程專用於此,但它應該是一個通用線程池 - 即涉及的線程數僅僅是配置問題,對整個設計沒有邏輯含義(即特定身份線程沒有任何意義 - 如果移動到一個更大的服務器,並且擁有8個人的核心,那麼添加更多的線程對於配置更多的線程而言並不會改變整體設計)。