2013-02-15 71 views
0

問題
我的一些朋友玩一個遊戲,最多包含4名玩家。我正在嘗試編寫一個程序,讓第五個人可以在遊戲中監控遊戲中發生的事情。兩個節目收聽一個插座

背景
的遊戲功能的多人部作爲這樣的:
一個玩家被指定爲「主機」。所有其他玩家通過輸入主機的IP地址連接到主機。主機的機器負責控制遊戲的AI。當遊戲中發生事件時,遊戲的主機副本會將事件發送給其他玩家的遊戲(客戶端)。如果客戶端玩家執行一個動作,他們的遊戲將動作發送給主持人,然後主持人將其發送給其他玩家,以便任何玩家的動作對所有其他玩家都可見。主機和客戶端都使用遊戲配置文件中預定義的單個TCP端口(例如:端口58282)。遊戲是一個實時策略遊戲(不是基於回合的)。

約束
1.遊戲的機制都沒有改變。它是預編譯的,無法改變多人遊戲機制。 2.比賽採用TCP問題
服務器和客戶端

之間的溝通有沒有辦法有一個單獨的程序,這是主機或者客戶端計算機上運行的聽遊戲端口(當遊戲正在進行時)?我知道TCP每個IP地址每個端口只允許一個套接字,所以讓遊戲和一個單獨的程序同時聽同一個端口是有問題的。假設我在遊戲開始之前啓動了外部應用程序,並讓應用程序監聽遊戲的端口,那麼應用程序是否可以通過遊戲端口聽到主機,獲取/複製該信息,然後將其轉發給遊戲? (有點像一個本地人在這方面的中間人)

終極問題

這可能給定的約束?我是以最好的方式去解決它嗎?

+0

你可以更改遊戲配置文件,讓它監聽另一個端口嗎?然後,*您*在它的官方端口上(客戶端連接的地方)監聽並將所有內容轉發到其他端口(即,您爲每個連接向兩個方向轉發所有數據)。 – 2013-02-15 21:59:38

+0

我相信在客戶端的配置文件中更改端口會導致客戶端嘗試與使用同一端口的主機進行通信(主機不在監聽!)。例如,將客戶端遊戲更改爲端口3333,以便應用程序可以監聽58282(並轉發至3333),這將導致遊戲嘗試與端口3333上的主機通信,即使主機正在使用58282. – 2013-02-15 23:07:24

回答

1

我會先回答第二個問題。你沒有走正確的道路。正確的方法是在服務器中實現一些功能,以允許單獨的「客戶端」連接另一個端口以定期收集統計數據。

有沒有辦法讓應用程序通過遊戲端口聽到主機, 接收/複製該信息,然後將其轉發給遊戲?

你不需要做一個mitm。您可以做一個簡單的數據包捕獲,其中包含一些無處不在的內容,如tcpdumpwireshark。例如,爲了捕捉TCP端口上的一切:

tcpdump -n -w capture.pcap tcp port 58282 

的其他應用程序將永遠不會知道你捕獲的數據。

+0

不幸的是,我不能改變遊戲的多人遊戲機制。這將是理想的,但考慮到這些限制,我正在研究捕獲數據包。如果我可以在端口58282上捕獲來自主機遊戲的數據包,我可以辨別出哪些數據包是有用的,並且可以隨時丟棄剩餘的數據包。然後可以將數據包中的數據發送給監控遊戲的「第5人」。讓我看看這讓我感覺如何。 – 2013-02-15 23:12:54