Во-первых, что именно делает Bonjour (пожалуйста, прочтите мои предположения, написанные ниже)?
Вот Я обнаружил, что Bonjour позволяет автоматически обнаруживать компьютеры, устройства и службы в IP-сетях. Но я подумал, что он не только «обнаруживает устройства в IP-сети», но также создает IP-сеть, назначая IP-адреса устройствам, на которых работает Bonjour. Я прав?
И я все еще скучаю по сути. Это работает следующим образом? Сначала я подключаю устройства (например, ноутбуки) физически, чтобы они могли общаться друг с другом. Затем, скажем, на некоторых ноутбуках у меня работает Bonjour, а затем, как следствие, эти ноутбуки автоматически назначают им IP-адреса. Итак, ноутбуки (на которых запущен Bonjour) создают IP-сеть. Это так работает?
Или может быть компьютер, на котором запущен Bonjour, не считается службой и не транслирует себя только потому, что Bonjour запущен на этом компьютере. Я имею в виду, что приложения, работающие на компьютерах, должны использовать Bonjour для трансляции себя. Таким образом, это приложения, которые транслируют себя (а не компьютеры), и это не делается автоматически (приложение должно транслировать себя явно). Это правильно?
Как именно мое приложение может транслировать себя? Могу ли я использовать командную строку для регистрации службы (чтобы все приложения, использующие Bonjour, знали, что появился новый сервис)?
Кроме того, я хотел бы иметь приложение, которое использует IP-сеть, созданную Bonjour. Для этого моему приложению необходимо знать, какие устройства / службы присутствуют в сети. Более подробно, в моем приложении должен быть список услуг. Каждая служба в списке должна иметь имя, IP-адрес, на котором она запущена, и порт, который используется приложением. Может ли Bonjour каким-либо образом предоставить эту информацию? Если да, то как именно это работает. Как моя программа может получить эту информацию от Bonjour? Может ли моя программа прочитать какой-нибудь файл, созданный Bonjour и содержащий вышеупомянутую информацию? Могу ли я использовать некоторые команды в командной строке для получения этой информации?
Меня особенно интересует доступ к информации об услугах из файлов, переменных среды или команд в командной строке. Эти варианты мне кажутся самыми простыми! Поскольку в этом случае мне не нужно использовать какие-либо дополнительные библиотеки для связи с Bonjour с определенного языка программирования.
P.S. Пожалуйста, задавайте вопросы, если что-то не понятно в моем вопросе. Постараюсь более четко сформулировать свой вопрос.
P.P.S. Я использую Windows 7.
ДОБАВЛЕНО: Я планирую писать свои приложения на PHP. На каждом компьютере должен быть запущен веб-сервер Apache. И я хочу использовать Bonjour, чтобы помочь компьютерам обнаруживать друг друга (компьютеры работают в локальной сети).
Да. Стюарт Чешир, который был создателем и основным разработчиком Rendezvous / Bonjour в Apple, который также был сопредседателем рабочей группы IETF ZeroConf и написал книгу О'Рейли по сетям с нулевой конфигурацией, охарактеризовал Bonjour как «тройную конфигурацию». табурет на ножках », где ножки:
Рабочая группа IETF ZeroConf и Apple рассматривают локальную адресацию канала связи, особенно IPv4-локальную адресацию канала (169.254.0.0/16
адреса), чтобы быть частью ZeroConf / Bonjour, даже несмотря на то, что локальная адресация каналов была отправлена на годы раньше двух других «ножек табурета».
Обратите внимание: поскольку Windows уже поддерживает автоматическую локальную адресацию каналов даже без установленного программного обеспечения Apple Bonjour для Windows, многие пользователи Windows не считают, что локальная адресация IPv4 является частью Bonjour / ZeroConf.
Да. Компьютеры Mac и Windows по умолчанию используют локальную адресацию IPv4, если они настроены для DHCP, но недоступен DHCP-сервер. Машины Linux и BSD с установленным Avahi (или, возможно, другими реализациями ZeroConf) также будут делать это.
Если на компьютере работает Bonjour, его имя хоста публикуется в локальной сети через mDNS. Если имя вашего компьютера «Алиса», оно будет Alice.local
через mDNS. С другого компьютера (назовем его «Боб») в той же локальной сети (в частности, в том же домене многоадресной передачи с локальной связью) вы должны иметь возможность просто ввести ping Alice.local
, и Боб должен выполнить поиск mDNS Alice.local
чтобы обнаружить IP-адрес (а) Алисы и проверить ответ (а) на адрес (а), который она получит.
Однако обратите внимание, что Bonjour различает имена хостов и имена служб. Например, если у вас есть два отдельных USB-принтера, скажем, «HP» и «Canon», подключенные к Алисе, и Алиса действует, скажем, как lpr
сервер печати для них обоих, каждый из них может отображаться как собственная служба, которая сопоставляется с Alice.local
как хозяин.
Имена их сервисов будут отображаться для пользователя как «HP» и «Canon» без упоминания Алисы. За кулисами они будут известны как HP._printer._tcp.local
и Canon._printer._tcp.local
, и поиск DNS-SD по этим именам служб покажет, что эти службы доступны на Alice.local
на двух разных TCP-портах.
Итак, да, приложения должны уведомлять демон Bonjour (называемый mDNSResponder
в реализации Apple), что у них есть услуги, которые они хотят рекламировать. В macOS есть механизмы для автоматической обработки объявлений службы для устаревших служб, которые изначально не поддерживают Bonjour. Например, macOS sshd
это OpenSSH, который напрямую не поддерживает Bonjour, но macOS позаботится о рекламе ssh
через Bonjour, чтобы вы могли ssh username@Alice.local
с других машин в локальной сети.
В macOS есть инструмент командной строки dns-sd, который может зарегистрировать службу, используя следующий синтаксис:
dns-sd -R <Name> <Type> <Domain> <Port> [<TXT>...]
# (Register a service)
Так например:
dns-sd -R MyWebsite _http._tcp local 80
Я не удивлюсь, если он будет включен в Bonjour для Windows или в Bonjour SDK для Windows, или если вы сможете скомпилировать его для Windows из Apple mDNSResponder проект с открытым исходным кодом. Поиск в Google для dns-sd.exe
, Я вижу, такая штука существует. Я не уверен, что просто загрузил бы для него двоичный файл. Вместо этого я бы попытался получить его из одного из упомянутых выше пакетов или сам скомпилировать из исходников проекта mDNSResponder.
Вы также можете использовать dns-sd
инструмент командной строки для поиска служб и их поиска. Вот пример поиска локальной веб-службы:
Найдите локальные веб-службы с помощью -B
:
$ dns-sd -B _http._tcp local
Browsing for _http._tcp.local
Timestamp A/R Flags if Domain Service Type Instance Name
16:30:59.870 Add 3 6 local. _http._tcp. My Cool Web App
16:30:59.871 Add 3 6 local. _http._tcp. Someone Else's Web Service
16:30:59.871 Add 3 6 local. _http._tcp. A Third One
^C
Найдите то, что мне нужно, "Мое классное веб-приложение", с -L
:
$ dns-sd -L "My Cool Web App" _http._tcp local
Lookup My Cool Web App._http._tcp.local
16:31:52.678 My\032Cool\032Web\032App._http._tcp.local. can be reached at MyWebServer.local.:80 (interface 6)
^C
Запросите IP-адреса MyWebServer.local с помощью -Q
:
$ dns-sd -Q MyWebServer.local
Timestamp A/R Flags if Name T C Rdata
16:32:40.786 Add 2 6 MyWebServer.local. 1 1 169.254.45.209
^C
Обратите внимание в этих примерах, что вы должны Ctrl-C
вне dns-sd
инструмент. В противном случае он будет оставаться открытым навсегда, постоянно наблюдая за сетью и сообщая о любых изменениях результатов отправленного вами запроса (например, веб-серверы, входящие и выходящие в сеть, пока вы сидите с -B
просмотреть запрос открытым). Я обнаружил, что по этой и другим причинам dns-sd
инструмент не подходит для вызова из скрипта. Возможно, вы все же захотите посмотреть, какие библиотеки ZeroConf для вашего предпочтительного языка.
Чтобы ответить на один из ваших других вопросов, я не знаю ни одной реализации ZeroConf, которая позволяет вам выполнять запросы и получать результаты, просто читая / записывая файлы. Большинство приложений, использующих Bonjour, делают это, вызывая API напрямую (приложения C / C ++ / Obj-C / Swift) или через библиотеку, специфичную для языка (интерпретируемые языки / языки сценариев).
Во-первых, что именно делает Bonjour (пожалуйста, прочтите мои предположения, написанные ниже)? Здесь я обнаружил, что Bonjour позволяет автоматически обнаруживать компьютеры, устройства и службы в IP-сетях. Но я думал, что он не только «обнаруживает устройства в IP-сети», но также создает IP-сеть, назначая IP-адреса устройствам, на которых работает Bonjour. Я прав?
Не совсем; как указал Джон, DHCP (обычно) используется для выделения IP-адресов. Во многом так же, как обычный DNS преобразует доменные имена в IP-адреса, Bonjour используется для преобразования временных доменных имен (в локальной сети) в предоставляющие их IP-адреса.
И я все еще скучаю по сути. Это работает следующим образом? Сначала я подключаю устройства (например, ноутбуки) физически, чтобы они могли общаться друг с другом. Затем, скажем, на некоторых ноутбуках у меня работает Bonjour, а затем, как следствие, эти ноутбуки автоматически назначают им IP-адреса. Итак, ноутбуки (на которых запущен Bonjour) создают IP-сеть. Это так работает?
Нет; ноутбуки, скорее всего, получают свои IP-адреса от локального DHCP-сервера. Bonjour просто помогает им понять, какие услуги каждый может предоставить другим.
Или может быть компьютер, на котором запущен Bonjour, не считается службой и не транслирует себя только потому, что Bonjour запущен на этом компьютере. Я имею в виду, что приложения, работающие на компьютерах, должны использовать Bonjour для трансляции себя. Таким образом, это приложения, которые транслируют себя (а не компьютеры), и это не делается автоматически (приложение должно транслировать себя явно). Это правильно?
Да - как правило, ваше приложение должно явно рекламировать свое существование. Это часто можно сделать с помощью системных библиотек (часто используемых в OS X) или пользовательских библиотек (например, Perl Net :: Bonjour).
Как именно мое приложение может транслировать себя? Могу ли я использовать командную строку для регистрации службы (чтобы все приложения, использующие Bonjour, знали, что появилась новая служба)
Мне неизвестен инструмент командной строки, который бы это делал, но на многих основных языках программирования есть библиотеки для этого.
Кроме того, я хотел бы иметь приложение, которое использует IP-сеть, созданную Bonjour. Для этого моему приложению необходимо знать, какие устройства / службы присутствуют в сети. Более подробно, в моем приложении должен быть список услуг. Каждая служба в списке должна иметь имя, IP-адрес, на котором она запущена, и порт, который используется приложением. Может ли Bonjour каким-либо образом предоставить эту информацию?
Большинство библиотек Bonjour должны сделать это за вас; см. первый пример на http://search.cpan.org/~chlige/Net-Bonjour-0.96/lib/Net/Bonjour.pm
Если да, то как именно это работает. Как моя программа может получить эту информацию от Bonjour? Может ли моя программа прочитать какой-нибудь файл, созданный Bonjour и содержащий вышеупомянутую информацию? Могу ли я использовать некоторые команды в командной строке для получения этой информации?
Используя соответствующие библиотеки, программа использует протокол Bonjour, чтобы попросить все остальные компьютеры в вашей локальной сети сообщить ей, какие службы у них доступны. Затем эта библиотека проанализирует ответы и представит их вам в более удобном формате.
Меня особенно интересует доступ к информации об услугах из файлов, переменных среды или команд в командной строке. Эти варианты мне кажутся самыми простыми! Поскольку в этом случае мне не нужно использовать какие-либо дополнительные библиотеки для связи с Bonjour с определенного языка программирования.
Я не знаю об инструменте, который это делает, но он может существовать.
P.S. Пожалуйста, задавайте вопросы, если что-то не понятно в моем вопросе. Постараюсь более четко сформулировать свой вопрос.
Дополнительная информация о том, что будет делать программа, которую вы пишете, и на каком языке вы ее пишете, чтобы вам было легче помочь.
Для получения дополнительной вводной информации попробуйте оба:
Bonjour не назначает IP-адреса - это протокол обнаружения - вам все равно нужны IP-адреса DHCP / Static / Link-Local (APIPA) для его работы.
Он использует многоадресный DNS (mDNS), чтобы обнаружить, какие хосты находятся в том же широковещательном домене, что и он сам, и по сути становится его собственным DNS-сервером.
Видеть Bonjour & Зероконф для подноготной.
Если ваше приложение не предназначено для домашней / неуправляемой сети, то есть при отсутствии локального DNS-сервера, он вам просто не нужен.