Поиск:

Ответ в темуСоздание новой темы Создание опроса
> QUdpSocket нет сигнала readyRead 
:(
    Опции темы
ymb
Дата 15.9.2016, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 16.1.2013

Репутация: нет
Всего: нет



Делаю пример из справки по приёму дейтограмм с протоколом UDP. 
Отправка работает. Получение нет.
Конкретно нет сигнала readyRead QUdpSocket.
Монитор сети Wireshark видит весь обмен.
Надо поймать послание на адрес 233.5.5.5. порт 4080.   

Это сообщение отредактировал(а) ymb - 15.9.2016, 16:03
PM MAIL   Вверх
Guinness
Дата 16.9.2016, 09:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 21.6.2009
Где: Зеленоград

Репутация: 2
Всего: 10



Я думаю, без примера кода тут помочь почти нереально.
PM MAIL   Вверх
ymb
Дата 16.9.2016, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 16.1.2013

Репутация: нет
Всего: нет



Есть прибор с ethernet интерфейсом, ip-адрес неизвестен.
Но есть команда по UDP протоколу на известный адрес, по которому прибор даёт ответ на этот же адрес, в котором содержится его ip.
И дальше можно работать по TCP протоколу.
Не приходит сигнал readyRead.
Пробовал помещать функцию чтения в отдельный поток и в отдельный процесс.
Если передающую и принимающую программу привязать (bind) к LocalHost, то между ними обмен работает.
Кстати заметил bind выдаёт true только с адресами принадлежащими сетевым картам моего компьютера, LocalHost и QHostAddress::Any.
Отключал все брандмауэры.
Для контроля обмена применяю Wireshark. 
Видно, что прибор отвечает. Только я не могу прочитать ответ.

Код

-----------------------------------------------
в h-файле

#include <QUdpSocket>

private:
  QUdpSocket *sokUdp;
------------------------------------------------
в конструкторе 

  sokUdp = new QUdpSocket(this);
  connect(sokUdp,SIGNAL(readyRead()),this,SLOT(readUPD()));

------------------------------------------------
void testprocess::writeUPD()
{

    QByteArray bcommand;
    char cCmd;
    cCmd = 0x07;
    bcommand.append(cCmd);
    cCmd = 0x05;
    bcommand.append(cCmd);
    sokUdp->bind(4080);
    sokUdp->open(QIODevice::ReadWrite);
    sokUdp->writeDatagram(bcommand,QHostAddress("233.5.5.5"),4080);
}
----------------------------------------------------------------------------
void testprocess::readUPD()
{
    QByteArray datagram;
    do {
        datagram.resize(sokUdp->pendingDatagramSize());
        sokUdp->readDatagram(datagram.data(), datagram.size());
   } while (sokUdp->hasPendingDatagrams());
    sokUdp->close();

}
----------------------------------------------------------------------------



Это сообщение отредактировал(а) ymb - 16.9.2016, 10:07
PM MAIL   Вверх
Guinness
Дата 16.9.2016, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 21.6.2009
Где: Зеленоград

Репутация: 2
Всего: 10



Цитата(ymb @  16.9.2016,  11:06 Найти цитируемый пост)
Если передающую и принимающую программу привязать (bind) к LocalHost, то между ними обмен работает.
Кстати заметил bind выдаёт true только с адресами принадлежащими сетевым картам моего компьютера, LocalHost и QHostAddress::Any.

Надо просто почитать, что bind делает.
Цитата(ymb @  16.9.2016,  11:06 Найти цитируемый пост)
Но есть команда по UDP протоколу на известный адрес, по которому прибор даёт ответ на этот же адрес, в котором содержится его ip.

Всё это здорово, только не очень понятно, как сервер по адресу ("233.5.5.5") узнает о Вас? Возможно, я не увидел код, который как-то с ним соединяется.
PM MAIL   Вверх
ymb
Дата 16.9.2016, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 16.1.2013

Репутация: нет
Всего: нет



Не знаю как. Факт: посылаю на этот адрес по UDP протоколу 2 байта.Прибор отвечает. Это видно на мониторе. 
UDP не требует коннекта. Послал и забыл.
 

Это сообщение отредактировал(а) ymb - 16.9.2016, 13:27
PM MAIL   Вверх
Guinness
Дата 16.9.2016, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 21.6.2009
Где: Зеленоград

Репутация: 2
Всего: 10



Т.е. ситуация следующая:
1 - Ваш ПК
2 - сервер ("233.5.5.5")
3 - устройство
1 -> 2 -> 3 (запрос ip адреса) 
3 -> 2 -> 1 (ответ устройства)
По wireshark видно как пакеты приходят от 2 к 1?
PM MAIL   Вверх
ymb
Дата 16.9.2016, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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
PM MAIL   Вверх
Guinness
Дата 16.9.2016, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 21.6.2009
Где: Зеленоград

Репутация: 2
Всего: 10



Что значит "Сеть"?
У меня есть предположение, что по адресу ("233.5.5.5") расположен сервер, который позволяет узнать ip-адрес устройства. Когда устройство отправляет свой ip, то вряд ли оно делает broadcast, а просто передаёт ответ на сервер, который уже в свою очередь передаёт ответ тому, кто запросил данный адрес. Опять же не используя broadcast.
Конечно, я могу ошибаться, и тогда у Вас на ПК должно быть видно как приходят UDP-датаграмы, которые по какой-то причине не обрабатываются в Вашем приложении.
Я предлагаю попробовать подключиться к нему и послать запрос через write, а не writeDatagram.
PM MAIL   Вверх
ymb
Дата 16.9.2016, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 16.1.2013

Репутация: нет
Всего: нет



Написано же "Сеть это кабель, соединяющий ПК и устройство".
Других аппаратов нет. Всего два аппарата соединены между собой одним кабелем.

Обмен идёт ПК -> Устройство и  Устройство -> ПК.
Надо было мне сразу так написать.

Если Вам так сильно нужен сервер, считайте, что он сидит в Устройстве.
Хотя на форумах пишут, что в UDP протоколе нет серверов и клиентов. Все могут посылать и все могут принимать. 

Монитор Wireshark видит обмен. 
WriteDatagram работает. Потому что ответ приходит. 
Нет сигнала ReadyRead. А без него как считать поступающие данные с помощью класса QUpdSocket?

Наверное надо использовать что-то другое. Переходить на функции уровнем ниже.  



Это сообщение отредактировал(а) ymb - 16.9.2016, 15:28
PM MAIL   Вверх
Guinness
Дата 16.9.2016, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 21.6.2009
Где: Зеленоград

Репутация: 2
Всего: 10



Цитата(ymb @  16.9.2016,  16:26 Найти цитируемый пост)
Написано же "Сеть это кабель, соединяющий ПК и устройство".
Других аппаратов нет. Всего два аппарата соединены между собой одним кабелем.

Извиняюсь, видимо, очень сильно меня смущает другой ip-адрес.
Вы пробовали использовать разные сокеты для отправки и приёма данных?
PM MAIL   Вверх
ymb
Дата 16.9.2016, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0774 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.