Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Чтение из UDP сокета [QT], Нет сигнала при поступлении данных 
:(
    Опции темы
svlary
Дата 5.12.2013, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Постановка задачи: Есть две программы, которые обмениваются UDP пакетами через порт 1952. Каждая и принимает и передаёт. И то и другое может происходить в любом порядке - никаких правил нет.

Суть проблемы: Отправка пакетов через 

Код

socket->writeDatagram( buf, len, address, Port);


выполняется совершенно нормально.  А вот с чтением - проблемы.  Пакеты приходят (проверено!) на eth интерфейс, но сокет чтения не посылает сигнал о поступлении данных, хотя написал всё, практически 100% - как в доке по Qt изложено:

Код

QUdpSocket *socket_r;
. . .
socket_r = new QUdpSocket(this);
socket_r->bind(QHostAddress::Any, Port);
сonnect(socket_r, SIGNAL(readyRead()), this, SLOT(readPendingDatagrams()));
. . .
void NetLink::readPendingDatagrams()
{
     cout << "readPendingDatagrams()" << endl;
}



Так вот сообщения "readPendingDatagrams()" не вижу, хотя пакеты приходят...
Кто знает - в чём может быть дело?  

PS Советов переходить на TCP сокеты не нужно smile 
PM MAIL   Вверх
Guinness
Дата 5.12.2013, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



1). socket_r - это глобальная переменная?
2). Объект NetLink, точно жив к моменту прихода сообщения?
PM MAIL   Вверх
svlary
Дата 5.12.2013, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(Guinness @ 5.12.2013,  13:43)
1). socket_r - это глобальная переменная?
2). Объект NetLink, точно жив к моменту прихода сообщения?

Цитата

1). socket_r - это глобальная переменная?
2). Объект NetLink, точно жив к моменту прихода сообщения?


  Это строчки выдернутые из описания класса NetLink:
- Первая строка из NetLink.h (раздел приватных переменных)
-  Следующие три - из конструктора класса NetLink
- Последние четыре - метод, который в h-файле описан в разделе private slots:

Та что с видимостью (вроде бы) всё в порядке... Всё это происходит внутри одного класса. Но что-то мне кажется, что тут МОС чудит...
PM MAIL   Вверх
Guinness
Дата 6.12.2013, 08:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Хорошо, Port совпадает? На передающем конце как передаются данные?

Это сообщение отредактировал(а) Guinness - 6.12.2013, 08:04
PM MAIL   Вверх
svlary
Дата 6.12.2013, 08:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(Guinness @  6.12.2013,  08:04 Найти цитируемый пост)

Хорошо, Port совпадает?

   Да, я это проверял..
  
Цитата

На передающем конце как передаются данные?


    А вот здесь я наткнулся на абсолютно непонятную (для меня) ситуацию...

Не сумев найти причины не срабатывания сигнала  SIGNAL(readyRead()) я просто взял готовый пример из книги Шлее М.
"Qt 4.8. Профессиональное программирование на C++". Собрал его и запустил. Мой приёмник работал!
У меня появлось подозрение, что это связано с тем, что в примере М.Шлее передача идёт на localhost. 
Я подправил пример, задав в нём вместо localhost свой IP и запустил с другого компа. 

Мой приёмник работал... Казалось бы, вывод очевиден: неправильно работает мой ПЕРЕДАТЧИК.
Но, увы... Если на приёмной стороне отказаться от использования сигнала, а сделать бесконечный цикл
 
Код

while ((len = sock.readDatagram(buf, 512)) <= 0);


То отправленные передатчиком пакеты принимаются нормально. Абсолютно нормально! Я распечатывал их содержимое...

В чём же разница между моим передатчиком и передатчиком М.Шлее ?
Я вижу два существенных отличия:

- Мой передатчик (так нужно в реальности) работает на архитектуре PowerPC, а учебный - x86. И у них разная адресация...
- Мой передатчик написан на чистом С и использует обычный вызов sendto, а учебный - writeDatagram.

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

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

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


 




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


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

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