UDP Broadcasting для автоматического поиска серверов - PullRequest
2 голосов
/ 17 октября 2010

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

Итак, я реализую это следующим образом.

Клиент передает свой IP-адрес на Broadcast IP и порт говорит А. Сервер прослушивает его через A, и

Сервер создает новое UDP-соединение с клиентом, действующим как клиент, скажем, через порт B. Он отправляет всю важную информацию, необходимую для игры, включая его IP.

Клиент является сервером для этого соединения и получает данные от сервера через порт B.

Теперь А и В являются константами. Поэтому, когда мне нужен сервер для прослушивания нескольких клиентов в разных потоках, я могу поставить значения diff для A и B для потоков, но в клиентском файле A и B не зависят от этих потоков. Так что это дает мне ошибку

bind: Address already in use

Какое вероятное решение для этого?

1 Ответ

4 голосов
/ 17 октября 2010

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

Я бы попросил клиента найти сервер через DNS Service Discovery ( DNS-SD ). Преимущество этого заключается в том, что вы можете использовать многоадресный DNS , пока ваш сервер находится в локальной подсети, и переходить на глобальный сервер, используя обычный администрируемый DNS, без каких-либо изменений в клиенте.

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

Наконец, к (как я думаю, был) ваш первоначальный вопрос: вместо разных портов для каждого клиента у меня будет один порт для всех клиентов. Каждый запрос от клиента будет содержать достаточно информации, чтобы сервер мог выполнить любой запрос, который он содержит. Сервер просто прослушивает свой единственный порт и обслуживает каждый запрос по мере его поступления. Вы можете выделить для этого более одного потока, но это должен быть общий пул потоков, т. Е. Количество задействованных потоков является просто вопросом конфигурации, не имеющим логического значения для общего проекта (т. Е. Идентичности конкретного Поток не имеет значения - если вы переходите на более крупный сервер с 8-кратным количеством человеко-ядер, добавление большего количества потоков - это просто вопрос настройки большего количества потоков, а не изменения общего дизайна).

...