Сигнал ReadyRead на QUdpSocket испускается только в том случае, если метод связывания вызывается первым

Использование PyQt4 и Qt4.1, Python 3.7.2, последний PyInstaller

У меня есть два приложения (С++ и Python), которые обмениваются данными через udp localhost, порт 2340 и порт 2341). В обоих приложениях я ограничиваю порты с помощью

self.SocketIn.bind(QtNetwork.QHostAddress.LocalHost, 2340, QtNetwork.QUdpSocket.ReuseAddressHint)
self.SocketIn.readyRead.connect(lambda: print("Hallo")

и (на стороне С++)

SocketOut->bind(QHostAddress::LocalHost, 2340, QUdpSocket::ReuseAddressHint);

Оба приложения возвращают значение true, а состояния также равны «4», что означает, что они находятся в BoundState.

Теперь проблема: если я сначала запускаю приложение Python, оно работает. Приложение С++ получает сообщения на порт 2341 и отправляет сообщения на 2340. Приложение Python получает сообщения на порт 2340 и отправляет сообщения на порт 2341. Если я сначала запущу приложение С++, приложение Python не вызовет сигнал readyRead на порту 2340. больше. Как я уже сказал, все boundStates есть (приложение Python, приложение C++, -> порты 2340, 2341), и сообщения действительно отправляются из приложения C++ (видно в wireshark)

В чем тут подсказка?

РЕДАКТИРОВАТЬ: Теперь я понял, что наоборот, такое же поведение. Похоже, что принимающая сторона должна быть сначала инициализирована, чтобы работать!


person raffro1337    schedule 20.04.2020    source источник
comment
предоставьте минимальный воспроизводимый пример   -  person eyllanesc    schedule 20.04.2020
comment
Не уверен, что я понимаю проблему здесь. В показанном коде есть примеры Python и c++, привязанные к порту 2340.   -  person G.M.    schedule 20.04.2020
comment
Правильно, оба должны быть привязаны к 2340, иначе приложение python не поймет сообщения со стороны c++   -  person raffro1337    schedule 20.04.2020
comment
Попал сюда в надежде найти MWE. Пожалуйста, закройте это как никому не нужное   -  person Edward Kigwana    schedule 25.02.2021


Ответы (1)


У меня была похожая проблема. В документации QUdpSocket указано

Если вы просто хотите отправлять дейтаграммы, вам не нужно вызывать bind().

Когда я удалил привязку с отправляющей стороны, я мог запускать и останавливать отправителя и получателя в любом порядке, и это работало.

person Janine    schedule 31.07.2020