![]() |
|
![]() ![]() ![]() |
|
ymb |
|
|||
Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 16.1.2013 Репутация: нет Всего: нет |
Делаю пример из справки по приёму дейтограмм с протоколом UDP.
Отправка работает. Получение нет. Конкретно нет сигнала readyRead QUdpSocket. Монитор сети Wireshark видит весь обмен. Надо поймать послание на адрес 233.5.5.5. порт 4080. Это сообщение отредактировал(а) ymb - 15.9.2016, 16:03 |
|||
|
||||
Guinness |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 21.6.2009 Где: Зеленоград Репутация: 2 Всего: 10 |
Я думаю, без примера кода тут помочь почти нереально.
|
|||
|
||||
ymb |
|
|||
Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 16.1.2013 Репутация: нет Всего: нет |
Есть прибор с ethernet интерфейсом, ip-адрес неизвестен.
Но есть команда по UDP протоколу на известный адрес, по которому прибор даёт ответ на этот же адрес, в котором содержится его ip. И дальше можно работать по TCP протоколу. Не приходит сигнал readyRead. Пробовал помещать функцию чтения в отдельный поток и в отдельный процесс. Если передающую и принимающую программу привязать (bind) к LocalHost, то между ними обмен работает. Кстати заметил bind выдаёт true только с адресами принадлежащими сетевым картам моего компьютера, LocalHost и QHostAddress::Any. Отключал все брандмауэры. Для контроля обмена применяю Wireshark. Видно, что прибор отвечает. Только я не могу прочитать ответ.
Это сообщение отредактировал(а) ymb - 16.9.2016, 10:07 |
|||
|
||||
Guinness |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 21.6.2009 Где: Зеленоград Репутация: 2 Всего: 10 |
Надо просто почитать, что bind делает.
Всё это здорово, только не очень понятно, как сервер по адресу ("233.5.5.5") узнает о Вас? Возможно, я не увидел код, который как-то с ним соединяется. |
|||
|
||||
ymb |
|
|||
Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 16.1.2013 Репутация: нет Всего: нет |
Не знаю как. Факт: посылаю на этот адрес по UDP протоколу 2 байта.Прибор отвечает. Это видно на мониторе.
UDP не требует коннекта. Послал и забыл. Это сообщение отредактировал(а) ymb - 16.9.2016, 13:27 |
|||
|
||||
Guinness |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 21.6.2009 Где: Зеленоград Репутация: 2 Всего: 10 |
Т.е. ситуация следующая:
1 - Ваш ПК 2 - сервер ("233.5.5.5") 3 - устройство 1 -> 2 -> 3 (запрос ip адреса) 3 -> 2 -> 1 (ответ устройства) По wireshark видно как пакеты приходят от 2 к 1? |
|||
|
||||
ymb |
|
|||
Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 16.1.2013 Репутация: нет Всего: нет |
Немного уточню:
1. Мой ПК (например 192.168.1.100) 2. Устройство 192.168.1.150 (адрес мне пока неизвестен) работа: 1. ПК -> Сеть 192.168.1.100 -> 233.5.5.5 Запрос. 2. Устройство -> Сеть 192.168.1.150 -> 233.5.5.5 Ответ, содержащий адрес 192.168.1.150 и другие данными. Сеть это кабель, соединяющий ПК и устройство. Других абонентов в сети нет. Вот этот ответ и надо поймать. Это сообщение отредактировал(а) ymb - 16.9.2016, 14:33 |
|||
|
||||
Guinness |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 21.6.2009 Где: Зеленоград Репутация: 2 Всего: 10 |
Что значит "Сеть"?
У меня есть предположение, что по адресу ("233.5.5.5") расположен сервер, который позволяет узнать ip-адрес устройства. Когда устройство отправляет свой ip, то вряд ли оно делает broadcast, а просто передаёт ответ на сервер, который уже в свою очередь передаёт ответ тому, кто запросил данный адрес. Опять же не используя broadcast. Конечно, я могу ошибаться, и тогда у Вас на ПК должно быть видно как приходят UDP-датаграмы, которые по какой-то причине не обрабатываются в Вашем приложении. Я предлагаю попробовать подключиться к нему и послать запрос через write, а не writeDatagram. |
|||
|
||||
ymb |
|
|||
Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 16.1.2013 Репутация: нет Всего: нет |
Написано же "Сеть это кабель, соединяющий ПК и устройство".
Других аппаратов нет. Всего два аппарата соединены между собой одним кабелем. Обмен идёт ПК -> Устройство и Устройство -> ПК. Надо было мне сразу так написать. Если Вам так сильно нужен сервер, считайте, что он сидит в Устройстве. Хотя на форумах пишут, что в UDP протоколе нет серверов и клиентов. Все могут посылать и все могут принимать. Монитор Wireshark видит обмен. WriteDatagram работает. Потому что ответ приходит. Нет сигнала ReadyRead. А без него как считать поступающие данные с помощью класса QUpdSocket? Наверное надо использовать что-то другое. Переходить на функции уровнем ниже. Это сообщение отредактировал(а) ymb - 16.9.2016, 15:28 |
|||
|
||||
Guinness |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 21.6.2009 Где: Зеленоград Репутация: 2 Всего: 10 |
||||
|
||||
ymb |
|
|||
Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 16.1.2013 Репутация: нет Всего: нет |
Да, пробовал разные сокеты.
Пробовал в разных потоках - сокет чтения в отдельном потоке. Потом сделал отдельную программу (т.е. получился отдельный процесс) для прослушивания. P.S. Проверил реакцию QUdpSocket на приём. Реагирует только на адрес сетевой карты (192.168.1.100 маска 255.255.255.0), 127.0.0.1, 192.168.1.255. С других адресов ничего не принимает. (Все, правда, не перебирал.) P.S.2. Надо делать снифер и фильтровать нужное. Это сообщение отредактировал(а) ymb - 16.9.2016, 21:02 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |