Игровой сервер: трансляция UDP-пакетов через Интернет? - PullRequest
0 голосов
/ 19 июля 2010

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

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

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

Ответы [ 3 ]

1 голос
/ 19 июля 2010

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

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

1 голос
/ 19 июля 2010

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

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

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

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

0 голосов
/ 19 июля 2010

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

...