2013-02-15 75 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