Две программы слушают один сокет

Проблема
Некоторые мои друзья играют в игру, в которой участвуют максимум 4 игрока. Я пытаюсь написать программу, которая позволит пятому человеку следить за тем, что происходит в игре, фактически не находясь в игре.

Предыстория
Многопользовательская часть игры функционирует следующим образом:
Один игрок назначается «хозяином». Все остальные игроки подключаются к хосту, вводя IP-адрес хоста. Компьютер хоста отвечает за управление ИИ игры. Когда в игре происходит событие, хост-копия игры отправляет событие в игру каждого из других игроков (клиентов). Если игрок-клиент выполняет действие, его игра отправляет действие хосту, который, в свою очередь, отправляет его остальным игрокам, чтобы действие любого игрока было видно всем остальным. Хост и клиенты используют один TCP-порт, предустановленный в файле конфигурации игры (например, порт 58282). Игра представляет собой стратегию в реальном времени (не пошаговую).

Ограничения
1. Механика игры неизменна. Он предварительно скомпилирован, и нет возможности изменить многопользовательскую механику. 2. Игра использует TCP для связи между сервером и клиентами

Вопрос
Есть ли способ иметь отдельную программу, которая работает либо на хост или клиентский компьютер прослушивают порт игры (во время игры)? Я знаю, что TCP разрешает только один сокет на порт для каждого IP-адреса, поэтому одновременное прослушивание игрой и отдельной программой одного и того же порта проблематично. Предполагая, что я запускаю внешнее приложение перед игрой и приложение прослушивает порт игры, есть ли способ для приложения услышать хост через игровой порт, взять/скопировать эту информацию, а затем перенаправить ее в игру? (Что-то вроде местного посредника)

Главный вопрос

Возможно ли это, учитывая ограничения? Я иду к этому наилучшим образом?


person Chris Richards    schedule 15.02.2013    source источник
comment
Можете ли вы изменить файл конфигурации игры, чтобы она прослушивала другой порт? Затем вы прослушиваете его официальный порт (куда подключаются клиенты) и пересылаете все на этот другой порт (то есть вы пересылаете все данные в двух направлениях для каждого соединения).   -  person Anton Kovalenko    schedule 16.02.2013
comment
Я считаю, что изменение порта в файле конфигурации клиента приведет к тому, что клиент попытается связаться с хостом, используя тот же порт (который хост тоже не прослушивает!). Например, изменение клиентской игры на порт 3333, чтобы приложение могло прослушивать 58282 (и пересылать на 3333), приведет к тому, что игра попытается связаться с хостом через порт 3333, даже если хост использует 58282.   -  person Chris Richards    schedule 16.02.2013


Ответы (1)


Сначала отвечу на второй вопрос. Вы идете не тем путем. Правильным способом было бы реализовать некоторые функции на сервере, чтобы позволить отдельному «клиенту» подключаться к другому порту для периодического сбора статистики.

Есть ли способ для приложения услышать хост через игровой порт, взять/скопировать эту информацию, а затем перенаправить ее в игру?

Вам не нужно делать митм. Вы можете выполнить простой захват пакетов с помощью таких вездесущих средств, как tcpdump или wireshark. Например, чтобы захватить все на этом TCP-порту:

tcpdump -n -w capture.pcap tcp port 58282

Другие приложения никогда не узнают, что вы захватили данные.

person cnicutar    schedule 15.02.2013
comment
К сожалению, я не могу изменить многопользовательскую механику игры. Это было бы идеально, но, учитывая ограничения, я рассматриваю возможность захвата пакетов. Если я смогу перехватить пакеты от хост-игры через порт 58282, я смогу определить, какие пакеты полезны, и отбросить остальные на лету. Затем данные из пакетов могут быть отправлены 5-му лицу, наблюдающему за игрой. Дай мне посмотреть, куда это меня приведет. - person Chris Richards; 16.02.2013