VariusRain
@VariusRain
музыкант-программист-конструктор

Как организовать связь клиент-сервер, если у сервера нет выделенного ip и не проброшены порты?

Вопрос, скорее, теоретический, нежели практический. То есть я не прошу показать мне куски рабочего кода. Я просто не понимаю принцип того, как это работает.

Вот возьмём в пример любую игру, в которой подразумевается мультиплеер. Вы в неё заходите, договариваетесь с другом, создаёте сервер. Он заходит в список доступных серверов, видит вас, кликает, вы соединяетесь, все счастливы.

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

И вот мне непонятно, как же происходит связь в таких случаях? Допустим в локальной сети того, кто решил стать сервером 3 машины, подключенные через роутер. Порты в этом самом маршрутизаторе никто, естественно, не прокидывал, белого айпи у пользователя нет.
Я понимаю, что скорее всего выделенный сервер игры, который и хранит и отображает список всех доступных игровых серверов служит, какой-то прослойкой между клиентами и при попытке подключения тыкает их друг в друга со словами "теперь вы друзья", но как это реализуется с технической точки зрения, я не понимаю и даже более того, не знаю как гуглить. Потому как, думаю, проблема тривиальная и ответ на поверхности.
  • Вопрос задан
  • 803 просмотра
Решения вопроса 2
egor_nullptr
@egor_nullptr
Начните с этой статьи https://en.wikipedia.org/wiki/Hole_punching_%28net...
Ответ написан
Комментировать
firedragon
@firedragon
Не джун-мидл-сеньор, а трус-балбес-бывалый.
Как вариант можно вот это попробовать. Под капотом все равно есть сервер где то в сети который первоначальный коннект делает дальше уже общаются сами с собой
https://professorweb.ru/my/csharp/web/level8/8_3.php
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 4
@delfer
https://github.com/fatedier/frp
Нужно поднять сервер где угодно, где можно выставить наружу порт, к нему подключить клиентов. Дальше между клиентам можно поднять p-to-p подключения и пробрасывать порты.
Ответ написан
Комментировать
GavriKos
@GavriKos
Вы смешали"игровой сервер" который считает логику, и сервер - машину доступную для всех оппонентов. Так вот, игровой сервер может быть действительно как выделенным, так и запущенным на одном из клиентов.
А вот чтобы клиенты видели друг друга без проброса портов и прочего - нужен сервер, который будет доступен напрямую всем машинам. Им может опять таки выступить один из клиентов, а может выступать условная машина где то в интернетах. И в таком случае эта машина будет выполнять только роль прокси - т.е. передавать пакеты между всеми клиентами и игровым сервером.
Для того же юнити можете посмотреть фотон - он как раз и предоставляет вот эту проксю.
Ответ написан
@Drno
Для первого коннекта используется промежуточный и доступный всем прокси в инете.
Далее он нстраивает связь между двумя игроками, и далее игроки общаются на прямую.
Одна из технологий p-2-p
Порты у игроков открываются друг к другу автоматически, с помощью технологии UPNP
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы