2013-09-03 7 views
2

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

Когда я тестирую свой сервер/клиент (ы) на том же компьютере (localhost), пакеты, похоже, мешают друг другу.

Например, если клиент отправляет пакет на сервер (UDP, 127.0.0.1:1338), клиент получает пакет, так как клиент также прослушивает пакеты с 127.0.0.1 на порте 1338. Аналогичным образом, когда я пытаюсь протестировать 2 клиента и 1 сервер, клиенты могут отправлять пакеты, предназначенные для сервера, но подбираются другим клиентом.

Как я могу проверить UDP на локальном хосте, поскольку все пакеты принимаются или отправляются на 127.0.0.1:1338? Нужно ли мне реализовать какой-то слой в моих пакетах, который отличает, предназначен ли пакет для сервера или конкретного клиента?

ответ

3

Дополнительный уровень не поможет - поскольку сервер никогда не сможет получить пакет.

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

У вас все еще есть другая проблема - нескольких клиентов, которые находятся на одной машине и слушают один и тот же порт. Вы можете иметь случайный порт для каждого клиента (клиент выбирает один случайным образом, а затем уведомляет сервер). Или вы можете попробовать привязать к различным IP-адресам (один будет использовать 127.0.0.1, другой будет использовать реальный IP-адрес ПК), но он не расширяется.

0

Если вы собираетесь использовать это в настройке локальной сети, вы всегда можете фильтровать полученный пакет на основе адреса отправителя - recvmsg() UDP позволяет вам получить адрес и номер порта отправителя. Если вы собираетесь использовать это в настройках WAN, это скорее всего не будет проблемой, если вы не пытаетесь выполнить многоадресную рассылку. И даже при многоадресной передаче дублирующие пакеты не отправляются обратно получателю. Вы можете использовать IP_MULTICAST_LOOP, чтобы отключить эту опцию.

4

Только ваш сервер должен прослушивать определенный номер порта (1338). Каждому клиенту необходимо выбрать номер бесплатного порта и отправить серверу этот номер порта. Сервер должен хранить информацию о клиенте и отправлять затем пакеты клиентам в этом списке клиентов.

Клиенты также должны отправить пакет goodby, когда клиент закрывает, чтобы знать на стороне сервера, какие клиенты по-прежнему доступны и которые больше не участвуют.

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

+0

Существует ли конкретный метод выбора номера порта на клиенте? Или я просто выбираю случайный порт между определенным диапазоном? – Brad

+0

Вам не обязательно предоставлять порт на сокет, он автоматически получит бесплатный доступ к операционной системе. См. Пример кода конструктора сокета в MSDN (http://msdn.microsoft.com/en-us/library/2b86d684.aspx). Нет Bind ... –

+0

@Brad Извините, я ошибся в своем предыдущем комментарии: Конечно, вам нужно привязать порт прослушивания клиента, но вам не нужно указывать номер порта. Просто передайте 0 в качестве номера порта. Из документации MSDN Socket.Bind (http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.bind.aspx): «Если вам не нравится, какой локальный порт используется, вы можете создать IPEndPoint, используя 0. для номера порта. В этом случае поставщик услуг назначит доступный номер порта от 1024 до 5000.» –

Смежные вопросы