Я сделал приложение, используя boost.Asio, используя UDP multicast.
Я не думаю, что вопрос действительно специфичен для boost.Asio, но для программирования сокетов в целом, так как boost.Asio предоставляет в основном оболочки для функций сокетов.
Я построил приложение на основе примеров многоадресной рассылки (
http://www.boost.org/doc/libs/1_44_0/doc/html/boost_asio/example/multicast/receiver.cpp
и ~ / sender.cpp)
и я развернул его на нескольких машинах под управлением Windows, Linux и
Mac с OSX Leopard. Мне очень приятно, что мультикастинг на всех
Платформа работает из коробки с кодом, полученным из примеров.
Когда я сталкиваюсь с проблемами, это когда я отсоединяю сетевой кабель. из
Конечно, отсоединение кабеля всегда вызовет проблемы;) но есть
тонкие различия, которые сводят меня с ума.
Моя настройка тестирования всегда следующая: одна машина с отправителем и
получатель, чтобы увидеть, получает ли та же машина свою собственную многоадресную рассылку, и
другая машина работает только с приемником. Я тяну сетевой шнур на
машина с отправителем и получателем.
Наблюдаемое поведение:
- Очевидно, что машина, на которой работает приемник, больше не получает
Сообщения. Этого следовало ожидать;)
- Когда на машине, на которой сетевой кабель отключен, работает Windows,
отправитель продолжает отправку, а получатель на той же машине продолжает
получить. Ошибок не обнаружено. Кажется, что окна имеют внутреннюю
откат к петле?
- Когда компьютер, на котором сетевой кабель отключен, работает под управлением Mac OSX,
отправитель продолжает отправку без сообщения об ошибке, но
приемник на той же машине больше не получает. Прежде чем спросить, я
проверил НЕ, чтобы установить опцию отключения обратной петли.
- Когда компьютер, на котором сетевой кабель отключен, работает под управлением Linux,
отправитель завершается с ошибкой boost :: error "Сеть недоступна". Очевидно, что
так как отправитель не может отправить данные, получатель не получает
больше ничего.
Для Linux я могу подделать поведение Windows, поймав
«недостижимая» ошибка (или перехват неправильного количества записанных байтов) и
установив флаг в моем коде, впоследствии отправив все данные на 127.0.0.1
вместо многоадресного адреса. Я регулярно проверяю, есть ли send_to на
конечная точка многоадресной рассылки по-прежнему выдает ошибку для обнаружения повторного подключения к сети
и вернемся к многоадресной рассылке. Это работает как шарм, потому что
Получатель связывает () с inaddr_any и, следовательно, слушает 127.0.0.1.
Для Mac OSX я не имею возможности заметить, когда сеть становится
недоступно сохранение службы для получателя на локальном компьютере.
Я заметил, что в Mac OSX я получаю сообщение об ошибке "Сеть недоступна"
один раз, когда сетевой кабель снова подключен, а DHCP не
еще приобрел новый IP-адрес.
Итак, в основном: как я могу добиться того, чтобы на MacOSX локальный клиент мог
все еще получаете от местного отправителя? Либо путем обнаружения потери сети
как я делаю в Linux или обманом, ведя себя как Windows.
Любой совет от людей, которые имеют более глубокое понимание сетевого программирования
чем я, очень ценится.