UDP-пакет на определенный IP-адрес в локальной сети

У меня есть встроенное устройство в моей локальной сети и приложение С++ в Linux на компьютере. Я сделал широковещательную рассылку UDP по своему широковещательному адресу подсети с C++, и мое устройство вернуло сообщение с подписью. У них обоих теперь есть IP-адреса друг друга. Мне нужно отправить UDP-пакет с моего С++ специально на IP-адрес моего устройства. Первоначальный вызов моего устройства был выполнен через UDP, но он использовал опцию широковещательной передачи в параметрах сокета. Некоторые из моих экспериментов с инструментами генерации пакетов создали впечатление, что UDP использует MAC ID для поиска пункта назначения. Итак, каким должен быть метод в С++, если я хочу отправить пакет UDP на мой конкретный IP-адрес в моей локальной сети? Спасибо


person UB_Roy    schedule 02.07.2013    source источник
comment
что ты уже испробовал? Кроме того, проверьте стек ISO, чтобы понять разницу между MAC-адресами и IP-адресами, они оба используются, хотя на одном и том же физическом носителе (включая радиоволну) MAC-адреса может быть достаточно. Кроме того, вы пробовали boost::asio?   -  person Geoffroy    schedule 02.07.2013


Ответы (3)


Судя по вашему ответу на stefaanv, ваш вопрос действительно звучит так: «Как мне получить IP-адрес из потока A в поток B?», Где поток A получает ответ на широковещательное сообщение, а поток B выполняет специфичные для устройства коммуникация.

Один из способов сделать это — создать поток B из потока A и передать IP-адрес в качестве аргумента функции потока B. Таким образом, поток B с самого начала будет знать, с каким IP-адресом разговаривать.

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

person Sam Skuce    schedule 02.07.2013

Если вы отправляете широковещательную рассылку и ожидаете ответов по UDP, вы должны получить их с recvfrom позвонить. Это заполняет адрес отправителя. Соответствующий вызов для отправки UDP с полученной адресной информацией — sendto.

person stefaanv    schedule 02.07.2013
comment
recvfrom выполняется в отдельном потоке. Мне нужно захватить данные и каким-то образом поделиться этими данными с основным потоком. хотелось бы знать погоду, эта комбинация «recvfrom - sendto» будет делиться информацией о пункте назначения, даже если они находятся в разных потоках - person UB_Roy; 02.07.2013
comment
Если используется как есть, вы можете передать sockaddr в разные потоки вместе с параметром длины. При необходимости можно разобрать sockaddr, используйте sockaddr_in из linux.die.net/man/7/ip. - person stefaanv; 02.07.2013

Вы не указали O/S, но...

Вы можете сделать так, чтобы сокет UDP использовал connect, если хотите. Затем это означает, что дальнейшие отправки в этот сокет будут идти на IP-адрес, к которому вы «подключились», и все это, несмотря на то, что UDP не устанавливает соединение.

person Joe    schedule 02.07.2013
comment
ОС ubuntu, IDE code::Blocks и gnu 4.7.3 Я в основном встроенный программист, изучаю программирование ПК на C++. Я создал сокет, заполнил sockaddr_in широковещательным адресом, установил параметры широковещания и отправил пакет (с моим буфером данных). Мое устройство прослушивает этот порт и захватывает этот UDP-пакет, проверяет подпись и отвечает своей подписью в самом широковещательном адресе. До этой части все в порядке, - person UB_Roy; 02.07.2013
comment
но с этого момента мне нужно отправлять данные конкретно в мои пункты назначения - никаких трансляций. Это моя идея. Я рассмотрел идею подключения на вышеупомянутой странице. Эта идея кажется мне приемлемой, по крайней мере, в начале, пока у меня есть только одно устройство в сети. Было бы более полезно, если бы я мог получить пример кода! Кстати, я пока не пробовал asio, я кое-что почитал и как-то сложилось впечатление, что это для больших сетевых проектов. Буду рад, если смогу получить информацию о применимости таких библиотек в подобном проекте. Большое спасибо - person UB_Roy; 02.07.2013