Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > Чтение из UDP сокета [QT]


Автор: svlary 5.12.2013, 12:46
Постановка задачи: Есть две программы, которые обмениваются 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 

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

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

Цитата

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


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

Та что с видимостью (вроде бы) всё в порядке... Всё это происходит внутри одного класса. Но что-то мне кажется, что тут МОС чудит...

Автор: Guinness 6.12.2013, 08:04
Хорошо, Port совпадает? На передающем конце как передаются данные?

Автор: svlary 6.12.2013, 08:47
Цитата(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()) где-то забыли поменять местами байты в принятом сообщении, из-за чего и нарушается логика работы.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)