【问题标题】:Two programs listening to one socket两个程序监听一个套接字
【发布时间】:2013-02-15 21:55:08
【问题描述】:

问题
我的一些朋友玩的游戏最多包含 4 名玩家。我正在尝试编写一个程序,它允许第五个人在不实际参与游戏的情况下监控游戏中发生的事情。

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

约束
1. 游戏机制不可更改。它是预编译的,无法更改多人游戏机制。 2.游戏使用TCP服务器与客户端通信

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

终极问题

考虑到限制,这可能吗?我会以最好的方式去做吗?

【问题讨论】:

  • 你能改变游戏配置文件让它监听另一个端口吗?然后you 监听它的官方 端口(客户端连接的地方)并将所有内容转发到另一个端口(也就是说,您在每个连接的两个方向上转发所有数据)。
  • 我相信更改客户端配置文件中的端口会导致客户端尝试使用同一端口与主机通信(主机也没有监听!)。例如,将客户端游戏更改为端口 3333 以便应用可以侦听 58282(并转发到 3333)会导致游戏尝试在端口 3333 上与主机通信,即使主机使用的是 58282。

标签: tcp port sharing multiplayer


【解决方案1】:

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

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

你不需要做中间人。你可以做一个简单的数据包捕获,像tcpdump 或wireshark 这样无处不在。例如,要捕获该 TCP 端口上的所有内容:

tcpdump -n -w capture.pcap tcp port 58282

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

【讨论】:

  • 很遗憾,我无法更改游戏的多人游戏机制。这将是理想的,但考虑到限制,我正在研究捕获数据包。如果我可以在端口 58282 上捕获主机游戏的数据包,我就可以辨别哪些数据包有用并即时丢弃其余数据包。然后可以将数据包中的数据发送给监控游戏的“第五人”。让我看看这能带给我什么。
猜你喜欢
  • 2021-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-07
  • 1970-01-01
  • 2016-11-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多