Задача следующая:
Есть некоторое устройство подключаемое "кабелем к сетевой карте". Для работы нужно знать IP устройства (ну и порт, но он не меняется).
Появилась хотелка узнать IP устройства автоматом, как сделано в проге загрузки фирмваре.
Там идея простая — специальный UDP пакет рассылается всем и устройство отсылает в Mutlicast группу свой ответ в котором и есть IP.
также важно использовать несколько другой вызов.
JoinMulticastGroup(groupAddress, networkCardAddress);
Проблема:
Wireshark показывает и присоединение к группе и отсылаемый пакет и принимаемый пакет. Пакет принимается по адресу "groupAddress".
Только вот прога никак не хочет принимать этот пакет из Mutlicast группы. Хотя отсылаемый пакет принять можно. https://msdn.microsoft.com/en-us/library/system.net.sockets.udpclient.enablebroadcast(v=vs.110).aspx
Различных сетевых адаптеров на машинке много, выбран был тот к которому подключён кабель от устройства.
Перепробывал вроде уже все рекомендации "из гугла" — результат стабильно отрицательный.
Хотя правда, еще не пробовал отсылать пакет всем адаптерам — есть и такая рекомендация. Но что то не вижу смысла отсылать пакеты адаптерам виртуальных машин.
Главная непонятка, что приходящий пакет виден в Wireshark, а принять не получается.
Здравствуйте, AlexNek, Вы писали:
AN>Главная непонятка, что приходящий пакет виден в Wireshark, а принять не получается.
Посмотри в сторону zeroconf или ssdp библиотек.
Здравствуйте, AlexNek, Вы писали:
AN>Главная непонятка, что приходящий пакет виден в Wireshark, а принять не получается.
Попробуй слушать по всем сетевым интерфейсам, т.е. не указывать карту. Попробуй внутри этой машины разослать на эту группу пакет- вот эта штука мне помогла https://github.com/marascio/mnc (первоисточник не нашёл).
Здравствуйте, AlexNek, Вы писали:
AN>Перепробывал вроде уже все рекомендации "из гугла" — результат стабильно отрицательный. AN>Хотя правда, еще не пробовал отсылать пакет всем адаптерам — есть и такая рекомендация. Но что то не вижу смысла отсылать пакеты адаптерам виртуальных машин.
AN>Главная непонятка, что приходящий пакет виден в Wireshark, а принять не получается.
Здравствуйте, kov_serg, Вы писали:
_>Тут пример клиента и сервера для мультикаста, работает под виндами и линухом даже. Когда-то делал для отладки. _>https://cloud.mail.ru/public/ADfL/6UnYWdXmh
Спасибо, можно будет на прием поставить и глянуть принимает что от устройства или нет.
Но скорее всего проблема комплексная, так как в других постах встречал подобное "А ваш код у меня работает без проблем".
Хотя у меня и сервер и клиент должны быть в одной проге.
А что подразумевается под параметром "multicast interface"?
И какой локальный адаптер используется? Или это и есть "multicast interface" судя по коду.
Здравствуйте, AlexNek, Вы писали:
AN>Здравствуйте, kov_serg, Вы писали:
_>>Тут пример клиента и сервера для мультикаста, работает под виндами и линухом даже. Когда-то делал для отладки. _>>https://cloud.mail.ru/public/ADfL/6UnYWdXmh AN>Спасибо, можно будет на прием поставить и глянуть принимает что от устройства или нет. AN>Но скорее всего проблема комплексная, так как в других постах встречал подобное "А ваш код у меня работает без проблем". AN>Хотя у меня и сервер и клиент должны быть в одной проге.
AN>А что подразумевается под параметром "multicast interface"? AN>И какой локальный адаптер используется? Или это и есть "multicast interface" судя по коду.
Да это в какой адаптор вещать. Когда их много без этого вещает в произвольный обычно не в тот.
Здравствуйте, Mr Bombastic, Вы писали:
MB>Здравствуйте, AlexNek, Вы писали:
AN>>Главная непонятка, что приходящий пакет виден в Wireshark, а принять не получается.
MB>Попробуй слушать по всем сетевым интерфейсам, т.е. не указывать карту. Попробуй внутри этой машины разослать на эту группу пакет- вот эта штука мне помогла https://github.com/marascio/mnc (первоисточник не нашёл).
...Пробовал добавлять в группу все адаптеры
А это не подойдет, а то копилировать С-шный код пятигодичной давности может быть проблемой, да и солюшин нужно самому делать... https://nmap.org/ncat/
Здравствуйте, AlexNek, Вы писали:
AN>Спасибо, можно будет на прием поставить и глянуть принимает что от устройства или нет. AN>Но скорее всего проблема комплексная, так как в других постах встречал подобное "А ваш код у меня работает без проблем".
Вспомнил мультикаст заработал сразу только в линухе, а винде был подвох.
Если подключить windows.h то констаны будут объявлены не правильно для multicast
может из-за этого у вас не пашет.
эта засада объяевлена в winsock.h (вместе с windows.h цепляется)
#define IP_MULTICAST_IF 2 /* set/get IP multicast interface */
вот что должно быть. объявлено в ws2tcpip.h
#define IP_MULTICAST_IF 9 /* set/get IP multicast i/f */
Здравствуйте, andrey.desman, Вы писали:
AD>Здравствуйте, AlexNek, Вы писали:
AN>>Главная непонятка, что приходящий пакет виден в Wireshark, а принять не получается.
AD>Твое дело, возможно, пошло бы быстрее, если бы ты свой пример выложил сюда.
На один экран всё не поместится, а больше никто и смотреть не будет думаю. Да и скорее всего проблема именно в конкретной конфигурации. Всё равно сейчас на этом компе ничего нет.
Здравствуйте, kov_serg, Вы писали:
_>Здравствуйте, AlexNek, Вы писали:
AN>>Спасибо, можно будет на прием поставить и глянуть принимает что от устройства или нет. AN>>Но скорее всего проблема комплексная, так как в других постах встречал подобное "А ваш код у меня работает без проблем". _>Вспомнил мультикаст заработал сразу только в линухе, а винде был подвох. _>Если подключить windows.h то констаны будут объявлены не правильно для multicast _>может из-за этого у вас не пашет.
_>эта засада объяевлена в winsock.h (вместе с windows.h цепляется) _>#define IP_MULTICAST_IF 2 /* set/get IP multicast interface */
_>вот что должно быть. объявлено в ws2tcpip.h _>#define IP_MULTICAST_IF 9 /* set/get IP multicast i/f */
так я пользую c#
Сегодня достаточно времени не было, но обнаружил, что всё заработало как только одну прогу разнес на сервер и клиент и запустил отдельно прием и отдельно передачу.
Пока есть предположение, что для UDP нельзя пользовать один и тот же сокет и для приема и для передачи.
Здравствуйте, AlexNek, Вы писали:
AN>Пока есть предположение, что для UDP нельзя пользовать один и тот же сокет и для приема и для передачи.
SO_REUSEADDR — надо выставить и пользуйся на здоровье.
Здравствуйте, kov_serg, Вы писали:
_>Здравствуйте, AlexNek, Вы писали:
AN>>Пока есть предположение, что для UDP нельзя пользовать один и тот же сокет и для приема и для передачи. _>SO_REUSEADDR — надо выставить и пользуйся на здоровье.
Здравствуйте, AlexNek, Вы писали:
AN>Сегодня достаточно времени не было, но обнаружил, что всё заработало как только одну прогу разнес на сервер и клиент и запустил отдельно прием и отдельно передачу. AN>Пока есть предположение, что для UDP нельзя пользовать один и тот же сокет и для приема и для передачи.
Напоролся на такое, когда разбирался с UPnP. Всё верно, мультикаст-сокет должен заниматься только мультикастом. Если хочется что-то ответить на свой же мультикаст — создайте новый сокет на другой порт и вещайте.