2015-05-19 3 views
0

Я пишу сетевой сервер для игрового сервера.Двунаправленная многоадресная рассылка UDP

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

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

Я написал тестовую программу, основанную на Java Tutorials (которая только отправляет сервер -> клиент), но мне не удалось адаптировать ее к двунаправленной связи. Я получаю Address already in use и Not a multicast address ошибки на клиенте.

Являются ли мои подозрения правильными, что такая двунаправленная связь невозможна с использованием одного и того же порта? Должен ли я использовать разные порты (один для многоадресной [сервер -> клиенты], один для одноадресной [клиенты -> сервер])?

(я делаю это в Java, но я больше заинтересован в сетевой стороне-оф-вещей это возможно против реализации стороны , как я это делаю.)

+1

Многоадресная рассылка однонаправленная (сервер -> клиенты). Сервер не может использовать одну и ту же связанную пару IP: порт для приема данных, она должна использовать другую пару IP: порт. –

+0

@RemyLebeau Откуда у вас эта идея? – EJP

ответ

1

Да, это возможно.

Предположим, что сервер с IP-адресом 192.168.1.2 хочет отправлять многоадресные сообщения в 224.1.2.3 порт 2222 и получать одноадресную рассылку обратно на порт 1111. На стороне сервера свяжите сокет datagram с адресом/портом 0.0.0.0: +1111. На стороне клиента свяжите сокет datagram с 0.0.0.0:2222, затем зарегистрируйте сокет для групповой группы 224.1.2.3. Сервер имеет возможность указывать 192.168.1.2 при привязке своего локального порта, но не требуется. Клиент должен привязываться к 0.0.0.0, иначе многоадресные пакеты не могут быть получены в системах Linux.

Когда сервер хочет отправить, он указывает как сообщение, так и IP/порт адресата. В этом случае сервер использует свой сокет для датаграммы для отправки в 224.1.2.3:2222, хотя вы можете позже отправить другой адрес/порт, если хотите. Полученный пакет имеет IP-порт источника 192.168.1.2:1111 и IP-порт назначения 224.1.2.3-22222.

Чтобы клиент мог отправить сервер обратно, он указывает как сообщение, так и IP/порт адресата, который в этом случае равен 192.168.1.2:1111. Таким образом, результирующий пакет имеет IP-порт источника {client_IP}: 2222 и порт назначения 192.168.1.2:1111. Требуется только один сокет на сервере и один сокет на каждом клиенте.

+0

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

+0

(также я хотел иметь один порт, а не один для отправки и один для приема) – baum

+0

Использование того же номера порта для клиента и сервера не должно быть проблемой, если они не работают на одной машине , – dbush

0

клиенты могут отправлять одноадресные данные на сервер, через тот же порт, что и многоадресный сокет?

Да, если сокет не связан с адресом многоадресной передачи. По-видимому, Linux требует этого, но другие платформы позволяют привязать его к 0.0.0.0.

Обратите внимание, что то, о чем вы просите, не является «двунаправленным многоадресным». Это многоадресная рассылка в одном направлении и одноадресная в другой.

+0

Но сервер * * использует многоадресную рассылку для другого направления. – baum

+1

@baum Для этого сервер не должен * связывать * с адресом многоадресной рассылки. Кроме, по-видимому, в Linux, по причинам, которые я никогда не понимал. Он даже не должен присоединиться к группе многоадресной передачи. Для этого нужно использовать только многоадресные приемники (клиенты). – EJP

+0

Я должен исправить это. Отправителю вообще не нужно связываться. Это * приемники *, которые могут потребовать привязки к многоадресному адресу. – EJP

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