| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > Чтение из UDP сокета [QT] |
| Автор: svlary 5.12.2013, 12:46 | ||||
| Постановка задачи: Есть две программы, которые обмениваются UDP пакетами через порт 1952. Каждая и принимает и передаёт. И то и другое может происходить в любом порядке - никаких правил нет. Суть проблемы: Отправка пакетов через
выполняется совершенно нормально. А вот с чтением - проблемы. Пакеты приходят (проверено!) на eth интерфейс, но сокет чтения не посылает сигнал о поступлении данных, хотя написал всё, практически 100% - как в доке по Qt изложено:
Так вот сообщения "readPendingDatagrams()" не вижу, хотя пакеты приходят... Кто знает - в чём может быть дело? PS Советов переходить на TCP сокеты не нужно |
| Автор: Guinness 5.12.2013, 13:43 |
| 1). socket_r - это глобальная переменная? 2). Объект NetLink, точно жив к моменту прихода сообщения? |
| Автор: svlary 5.12.2013, 18:24 | ||||
Это строчки выдернутые из описания класса NetLink: - Первая строка из NetLink.h (раздел приватных переменных) - Следующие три - из конструктора класса NetLink - Последние четыре - метод, который в h-файле описан в разделе private slots: Та что с видимостью (вроде бы) всё в порядке... Всё это происходит внутри одного класса. Но что-то мне кажется, что тут МОС чудит... |
| Автор: Guinness 6.12.2013, 08:04 |
| Хорошо, Port совпадает? На передающем конце как передаются данные? |
| Автор: svlary 6.12.2013, 08:47 | ||||
Да, я это проверял..
А вот здесь я наткнулся на абсолютно непонятную (для меня) ситуацию... Не сумев найти причины не срабатывания сигнала SIGNAL(readyRead()) я просто взял готовый пример из книги Шлее М. "Qt 4.8. Профессиональное программирование на C++". Собрал его и запустил. Мой приёмник работал! У меня появлось подозрение, что это связано с тем, что в примере М.Шлее передача идёт на localhost. Я подправил пример, задав в нём вместо localhost свой IP и запустил с другого компа. Мой приёмник работал... Казалось бы, вывод очевиден: неправильно работает мой ПЕРЕДАТЧИК. Но, увы... Если на приёмной стороне отказаться от использования сигнала, а сделать бесконечный цикл
То отправленные передатчиком пакеты принимаются нормально. Абсолютно нормально! Я распечатывал их содержимое... В чём же разница между моим передатчиком и передатчиком М.Шлее ? Я вижу два существенных отличия: - Мой передатчик (так нужно в реальности) работает на архитектуре PowerPC, а учебный - x86. И у них разная адресация... - Мой передатчик написан на чистом С и использует обычный вызов sendto, а учебный - writeDatagram. И у меня есть такое сильное подозрение, что разработчики Qt, при написании сигнала SIGNAL(readyRead()) где-то забыли поменять местами байты в принятом сообщении, из-за чего и нарушается логика работы. |