Игровой сервер: передача UDP-пакета через Интернет?

Мой друг сделал небольшую игру, в которую можно играть по локальной сети, и попросил меня изменить ее, чтобы в нее можно было играть через Интернет. Я не хочу вносить огромные изменения в клиентское приложение.

Когда игра создается, сервер продолжает отправлять пакеты UDP BROADCAST, чтобы сообщить всем, что игра была создана. Теперь мне просто нужно изменить этот BROADCAST, чтобы отправить эти пакеты на группу интернет-IP-адресов.

Можете ли вы сказать мне, является ли следующее решение хорошим: я бы создал комнатный сервер, давайте назовем его «room-broadcast-server», который содержит IP-адреса всех, кто присоединился к комнате. Затем клиенты, вместо отправки этого пакета BROADCAST, будут отправлять пакет на сервер room-broadcast-server, который будет транслировать этот пакет всем, кто присоединится к комнате.

Проблема в том, что клиенты будут получать эти пакеты от «комнатного-широковещательного-сервера» и будут пытаться установить связь с комнатной-широковещательным-сервером вместо связи с машиной, которая создала игру. Хотелось бы обмануть клиентов, чтобы они думали, что пакет пришел с игрового сервера, а не с рум-трансляции-сервера. Как я могу это сделать?


person Lost Developer    schedule 18.07.2010    source источник
comment
Насколько мне известно, довольно сложно «подделать» источник входящего пакета (т.е. сделать так, чтобы данные с сервера room-broadcast-server выглядели так, как будто они с игрового сервера). Вы изучали использование UDP-Multicast? Затем каждый клиент должен прослушивать определенный порт/группу. Отказ от ответственности: мне никогда не удавалось заставить это работать правильно из-за проблем с TTL.   -  person anq    schedule 19.07.2010


Ответы (3)


Вы изменяете только сервер или оба сервера, и клиенты? Я думаю, что было бы проще просто полностью удалить широковещательную рассылку и позволить клиентам явно выбирать сервер, к которому они хотят подключиться, а не полагаться на широковещательную рассылку сервера.

В версии 1 вы можете просто потребовать от игроков ввести IP-адрес/DNS-имя сервера в клиенте для подключения.

Для версии 2 вы можете добавить поддержку «лобби», где у вас есть (известный) центральный сервер лобби, к которому подключаются и клиенты, и сервер, чтобы найти друг друга (таким образом, серверы подключаются к лобби, чтобы объявить о своем присутствии, а затем клиенты подключиться к лобби, чтобы просмотреть серверы, к которым они хотят подключиться).

В игре, которую я писал (но в настоящее время приостановлен из-за нехватки свободного времени: p), я написал «лобби»-сервер как простое веб-приложение PHP + MySQL, и клиенты и серверы использовали HTTP-запросы для его опроса. для обновлений и так далее. Таким образом, я мог бы разместить центральный сервер лобби на дешевом веб-хосте, и любой мог бы размещать игры (недостаток в том, что дешевые веб-хосты не допускают произвольных подключений к сокету, поэтому я не смог реализовать на нем сквозной NAT). , но если/когда игра станет популярной, мой план состоял в том, чтобы переместить сервер лобби на более дорогой хост, который разрешал произвольные подключения к сокету...)

person Dean Harding    schedule 18.07.2010
comment
Да, думаю, мне придется использовать второй вариант. Спасибо - person Lost Developer; 19.07.2010

Подмена исходного адреса не является подходящим механизмом для вашего обычного протокола приложения. Это требует специальных разрешений на клиентских машинах, оно будет удалено некоторыми сетевыми фильтрами и, как правило, является грубым и антисоциальным.

Поскольку вы все равно модифицируете клиентов (чтобы отправлять сообщения на игровой сервер, а не на широковещательный адрес), вы можете просто заставить игровой сервер добавлять «истинный источник» пакета к каждому отправляемому пакету и иметь клиенты ожидают и обрабатывают эту информацию в пакетах, которые они получают от игрового сервера.

person caf    schedule 19.07.2010
comment
Да, я боялся, что для подмены исходного адреса потребуются специальные разрешения и что где-то это может быть сочтено «вредоносным». Большое вам спасибо! - person Lost Developer; 19.07.2010

Базовая концепция (один центральный лобби-сервер + несколько игровых серверов) второго варианта от Дина хороша и очень распространена даже в розничных онлайн-играх. Одна вещь, которую я не понимаю, это то, почему вы хотите подделать IP-адреса. Клиентам все равно, какой IP-адрес сервера, если он получает от него действительные пакеты. Кроме того, имхо, вам не нужно создавать отдельный сервер комнаты (?), Поскольку игровой сервер может / должен управлять списком клиентов, поскольку клиенты подключаются через сервер лобби.

person young    schedule 19.07.2010