![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
billidean |
![]()
Сообщение
#1
|
Новичок Группа: Новичок Сообщений: 2 Регистрация: 9.11.2013 Пользователь №: 3968 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Приветствую всех.
Накидал приложение на QT 5.1.0, которое общается по Езернету с внешним устройством (плата с ПЛИСкой) с использованием UDP. Код взял с примера.
Данные в сети контролирую WireShark'ом. Если нажать pushButton_2, то на плату приходит пакет, плата отвечает одной или двумя датаграммами, Qt-приложение принимает эти датаграммы, и все счастливы. НО!! если плата сама инициирует передачу датаграммы в линию, отмечу САМА, а не в ответ на принятые данные, то Qt-приложение ни.. не реагирует. Я уже пробовал с платы передавать в разные моменты, после небольшой паузы после двухстороннего обмена, до него, и нифига. Пакеты, отсылаемые с платы в обоих случаях, абсолютно одинаковые (даже идентификаторы пакетов и контр.суммы одинаковые). Где что попинать, чтобы приложение принимало UDP-пакеты не после отправки своих данных. З.Ы.: в Qt с сетями почти не работал. З.З.Ы.: Когда-то делал два приложения клиент-сервер работающие на разных машинах - проблем не было. сервер и клиент принимали/отправляли данные. |
|
|
gormih |
![]()
Сообщение
#2
|
Студент ![]() Группа: Новичок Сообщений: 15 Регистрация: 22.9.2011 Пользователь №: 2901 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Данные в сети контролирую WireShark'ом. Если нажать pushButton_2, то на плату приходит пакет, плата отвечает одной или двумя датаграммами, Qt-приложение принимает эти датаграммы, и все счастливы. НО!! если плата сама инициирует передачу датаграммы в линию, отмечу САМА, а не в ответ на принятые данные, то Qt-приложение ни.. не реагирует. Я уже пробовал с платы передавать в разные моменты, после небольшой паузы после двухстороннего обмена, до него, и нифига. Пакеты, отсылаемые с платы в обоих случаях, абсолютно одинаковые (даже идентификаторы пакетов и контр.суммы одинаковые). Где что попинать, чтобы приложение принимало UDP-пакеты не после отправки своих данных. З.Ы.: в Qt с сетями почти не работал. З.З.Ы.: Когда-то делал два приложения клиент-сервер работающие на разных машинах - проблем не было. сервер и клиент принимали/отправляли данные. А если отладчиком зайти, и посмотреть - возникает ли вообще событие прихода пакета с платы? Проблема скорее всего в этом, и копать туда? |
|
|
Iron Bug |
![]()
Сообщение
#3
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: ![]() ![]() ![]() |
попробуй так:
и проверь настройки файрволла. что порт 1111 разрешён. |
|
|
billidean |
![]()
Сообщение
#4
|
Новичок Группа: Новичок Сообщений: 2 Регистрация: 9.11.2013 Пользователь №: 3968 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
и проверь настройки файрволла. что порт 1111 разрешён. Пока не смотрел, но наверное разрешен, иначе пакеты бы вообще никогда не приходили. А если отладчиком зайти, и посмотреть - возникает ли вообще событие прихода пакета с платы? Проблема скорее всего в этом, и копать туда? у меня в обработчике есть строка
и если бы было прерывание, то в консоли бы я видел запись. А я ничего не видел. udpSocket->bind(QHostAddress::Any, 1111) Вот это тоже не понятно зачем. Я понимаю, что обмен по UDP не использует никаких соединений, т.е. посылка вылетела в сеть и всё, забыли про неё, НЕТ никаких запросов и ответов. НО ПОЧЕМУ тогда при ситуации "сервер отправил - клиент принял + отправил" сервер принимает пакет, а при "просто клиент отправил" сервер не принимает пакет, причем пакеты одинаковые. Спасибо всем за участие. Ответ оказался банальным - НЕВНИМАТЕЛЬНОСТЬ. Сто раз все смотрел-пересмотрел, а не увидел разницу в контрольных суммах пакетов, которые передаются из платы в разных ситуациях. В одном случае она равна 0х3c5b, а в другом - 0x3c5d, а я не заметил разницу. Видимо долго сидел и взгляд замылился. Теперь сделал правильные контрольные суммы в обоих случаях и сервак принимает все пакеты. |
|
|
![]() ![]() ![]() |
![]() |
Текстовая версия | Сейчас: 26.2.2025, 16:51 |