Подтвердить что ты не робот

0MQ - получить сообщение ip

Во-первых, я хочу поблагодарить за это замечательное lib! Я люблю это. Клиент подключается к серверу. Сервер должен сохранять IP-адрес и делать с ним материал позже (мне действительно нужен IP-адрес). Я нашел ответ: http://lists.zeromq.org/pipermail/zeromq-dev/2010-September/006381.html, но я не понимаю, как я получаю IP-адрес сообщения (XREP)... Я думаю, что я могу читать только ID, но IP управляется внутренне 0MQ. Его второе решение предлагает отправить IP-адрес в качестве части сообщения, но я не понимаю, как получить "общедоступный" -IP. Я нашел это сообщение: Получить информацию о адресе TCP в ZeroMQ

 is pass bind a service to an ephemeral port, get a full connection endpoint ("tcp://ipaddress:port")

Я не понимаю, как это работает. Он имеет в виду что-то вроде веб-сервиса? На мой взгляд, было бы лучше получить IP из 0MQ (у него уже есть IP). Я бы даже отрегулировал 0MQ для этого, если кто-то мог указать на то место, где был сохранен IP, не смог его найти. На данный момент типы сокетов не так важны. Я бы предпочел что-то вроде REQ-REP. Спасибо!

4b9b3361

Ответ 1

Резюме:

TL; DR ответ на ваш вопрос: вы не можете получить IP-адрес партнера, который отправил сообщение, используя API ZeroMQ.

Объяснение:

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

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

Подводя итог: даже если ZeroMQ сможет предоставить вам IP-адрес подключенного партнера, вы не должны зависеть от него. ZeroMQ скрывает от вас управление соединениями, поэтому вы можете сосредоточиться на обмене сообщениями. Управление подключением включает в себя пересоединения, что может привести к изменению IP-адреса без изменения фактического гнезда ZeroMQ, подключенного с другой стороны.

Ответ 2

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

Когда мобильное устройство входит в сеть, оно отправляет список файлов прошивки на сервер через соединение дилера-маршрутизатора. На сервере имеется список всех файлов прошивки; если клиенту требуется обновление, он инициирует обновление через отдельный механизм.

Поскольку IP-адреса для устройств могут (и делать) меняться, нам нужно знать IP-адрес, связанный с мобильным устройством ДЛЯ ЭТОГО СОЕДИНЕНИЯ, то есть прямо сейчас.

Да, мы абсолютно можем заставить клиента отправить ему IP-адрес в сообщении, но это пустая трата других n байтов полезного эфирного времени в сателлите и, хотя это не чистое зло, наверняка раздражает. Zmq уже имеет эту информацию, если у нее ее нет, она не сможет генерировать ответы. Адрес находится в данных сокета, нет причин, по которым сообщение не могло (необязательно, для всех вас, ребята, которые используют проводные сети и считают, что разъединения являются исключением) включают ссылку на структуру сокетов, чтобы вы могли получить адрес из него, Помимо педантичной религиозности, которая слишком распространена в zmq.

Ответ 3

Способ ZeroMQ не предназначен для предоставления информации на удаленном IP-адресе. Насколько я знаю, вам нужно управлять этим через ваше приложение, отправив эту информацию в качестве сообщения какого-то рода.

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