UDP: Как клиент узнает свой сервер? - PullRequest
0 голосов
/ 20 февраля 2012

Я нюхаю два устройства, которые обмениваются данными в дуплексном режиме через UDP Я использую Wireshark, чтобы нюхать. В файле конфигурации для первого устройства (часть тестируемого оборудования) указывается, что клиентский порт - 54718, а сервер - 54717. В файле конфигурации для второго устройства (симулятор, написанный несколько лет назад) указан только один порт. Это 54718.

Два устройства общаются без проблем.

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

В wireshark я вижу, что первое устройство отправляет второе устройство так, что порт источника 54717, а пункт назначения 54718. Я также вижу, что второе устройство отправляет первое устройство так, что порт источника 54718 и пункт назначения 54717.

Первое устройство отправляет первым, а протокол описывается как протокол UDP в Wireshark. Симулятор отвечает, также через UDP. Последующие обмены описываются как сообщения STUN ChannelData TURN. Я не знаю этого протокола, но, возможно, он объясняет, почему я не вижу 54717 в файле конфигурации симуляторов.

Спасибо за вашу помощь,

Barry

Ответы [ 3 ]

1 голос
/ 20 февраля 2012

Во-первых, в UDP-коммуникации нет действия «подключиться».UDP не ориентирован на соединение.

Во-вторых, второе устройство получит адрес и порт однорангового соединения из вызова API recvfrom ().

1 голос
/ 07 марта 2012

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

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

Итак, я буду называть «первое устройство» клиентом, а «второе устройство» сервером.

Каждая датаграмма, отправляемая с клиента на сервер, содержит два набора адресной информации: 1) IP-адрес и порт назначения, и 2) Обратный IP-адрес и порт.

Сервер может использовать recvfrom () для извлечения полного обратного адреса (включая номер порта) из каждого входящего запроса.

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

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

0 голосов
/ 20 февраля 2012

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

UDP не использует соединение, и ваша программа, скорее всего, получит 54717 в качестве запасного значения по умолчанию, если ничего не указано (например, в файле конфигурации).

...