两个程序监听一个套接字

时间:2013-02-15 21:55:09

标签: tcp port sharing multiplayer

问题
我的一些朋友玩游戏,最多涉及4名玩家。我正在尝试编写一个程序,允许第5个人监控游戏中发生的事情而不会真正进入游戏。

背景
游戏的多人游戏部分的功能如下:
一名球员被指定为“主人”。所有其他玩家通过输入主机的IP地址连接到主机。主持人的机器负责控制游戏的AI。当游戏中发生事件时,游戏的主机副本将事件发送给其他玩家的每个游戏(客户端)。如果客户端玩家执行某个动作,他们的游戏会将动作发送给主持人,主持人又将其发送给其他玩家,以便任何玩家的动作对所有其他玩家都可见。主机和客户端都使用游戏配置文件中预定义的单个TCP端口(例如:端口58282)。游戏是一个即时战略游戏(不是回合制)。

约束
1.游戏的机制是不可改变的。它是预编译的,没有办法改变多人游戏机制。 2.游戏使用TCP在服务器和客户端之间进行通信

问题
有没有办法让一个单独的程序,在主机或客户端计算机上运行,​​听取游戏的端口(游戏正在进行)?我知道TCP每个端口每个端口只允许一个套接字,因此让游戏和单独的程序同时监听同一个端口是有问题的。假设我在游戏开始之前启动外部应用程序并让应用程序听取游戏端口,那么应用程序是否有办法通过游戏端口听取主机,获取/复制该信息,然后将其转发到游戏中? (有点像当地的中间人)

终极问题

鉴于这些限制,这可能吗?我是以最好的方式去做的吗?

1 个答案:

答案 0 :(得分:1)

我先回答第二个问题。你不是正确的方式。正确的方法是在服务器中实现某些功能,以允许单独的“客户端”在另一个端口上连接以定期收集统计信息。

  

有没有办法让应用程序通过游戏端口听到主机,   获取/复制该信息,然后将其转发给游戏?

你不需要做一个mitm。您可以使用tcpdumpwireshark等无处不在的内容进行简单的数据包捕获。例如,要捕获该TCP端口上的所有内容:

tcpdump -n -w capture.pcap tcp port 58282

其他应用程序永远不会知道您捕获了数据。