Коллеги, добрый вечер Два приложения, оба работают с сокетом Udp с

помощью класса QUdpSocket. Схема подключения у обоих приложениях одинаковая (подключаюсь к 127.0.0.1 и порт 3000):
socket = new QUdpSocket(this);
if(socket->state() == QAbstractSocket::BoundState)
socket->leaveMulticastGroup(QHostAddress(host));
socket->close();
socket->setSocketOption(QAbstractSocket::KeepAliveOption, QVariant(1));
socket->setSocketOption(QAbstractSocket::MulticastLoopbackOption, QVariant(1));
socket->setSocketOption(QAbstractSocket::MulticastTtlOption, QVariant(255));
bool error = socket->bind(QHostAddress(host), port,
QAbstractSocket::ShareAddress | QAbstractSocket::ReuseAddressHint);
if(!error){
qWarning() << "Bind " << host << port << " failed";
return;
}
if(socket->state() == QAbstractSocket::BoundState)
socket->joinMulticastGroup(QHostAddress(host));
}
Передаю/принимаю дейтаграммы. Принимаю через слот, подключенный к сигналу readyRead().

Запускаю оба приложения, начинаю передачу/прием. Wireshark показывает, что данные отправляются. Принимающее приложение этих данных в упор не видит

Если тот же порядок действий не разносить на два приложения, а делать всё в одном, то всё работает, и прием идет, и передача

Собственно, то приложение (первое), которое принимает - основное, проверял отработку некоторой функции, которая должна анализировать определенным образом входные данные и делать действия. Приложение-передатчик (второе) - тестовое приложение, по-быстрому собранное для локальной проверки, ибо первое приложение извне никаких данных не хочет принимать, только внутри приложения работает прием

Вопрос такой: может, есть какие-то нетривиальные настройки/ограничения, которые я не учел?

1 ответов

11 просмотров

Добавьте таймер и по нему принудительно обрабатывайте очередь... в 5.х без такого костыля не работает class TMCastReceiver: public QObject { ... private: QWidget *m_parent; QUdpSocket *saMC; QString receivedData; QMap<QString, QString> recBuffer; QTimer *timer; bool IsReceiveStarted; bool IsReceiveProcess; ... private slots: void processPendingDatagrams(); void timerProcess(); ... } TMCastReceiver::TMCastReceiver(QWidget *parent) :QObject(parent), m_parent(parent), saMC(nullptr) { __DEBUG_MESSAGE; timer = new QTimer(this); IsReceiveStarted = false; IsReceiveProcess = false; connect(timer, SIGNAL(timeout()), this, SLOT(timerProcess())); timer->start( 250); } .... void TMCastReceiver::timerProcess() { if (saMC && IsReceiveStarted && !IsReceiveProcess) processPendingDatagrams(); } ... void TMCastReceiver::processPendingDatagrams() { __DEBUG_ENTER_FUNC__ IsReceiveProcess = true; QString mes; bool is_received = false; while ( saMC->pendingDatagramSize()!=-1 ) { __DEBUG_MESSAGE << "saMC->pendingDatagramSize()=" << saMC->pendingDatagramSize(); QNetworkDatagram dgram = saMC->receiveDatagram(); __DEBUG_MESSAGE << tr("\nReceived IP datagram from %2:%3: \"%1\"") .arg(dgram.data().constData(), dgram.senderAddress().toString()) .arg(dgram.senderPort()); recBuffer[QString("%1:%2").arg(dgram.senderAddress().toString()).arg(dgram.senderPort())] += dgram.data().constData(); is_received = true; } if (!is_received) { __DEBUG_EXIT_FUNC__ IsReceiveProcess = false; return; } receivedData.clear(); ... // разбор ... IsReceiveProcess = false; __DEBUG_EXIT_FUNC__ }

Похожие вопросы

Обсуждают сегодня

Я колись ставив гуглу антиспам 3.0, може і норм, але мені не дуже зайшло. Теж думав тиждень, що його і куди. Зупинився на трех варіантах відразу всі три і включив 1. Перевір...
𝓔𝓾𝓰𝓮𝓷𝓮𝓥 J
2
Портфолио: Зовут меня Александр, мне 36 лет. Город Пушкино. Общий рабочий стаж: ~14 лет Уровень квалификации: Senior Full-stack developer Где прочесть мой код? https://github....
Magic
10
Портфолио: Зовут меня Александр, мне 41 год. Город Киров. Общий рабочий стаж: ~14 лет Уровень квалификации: Senior Full-stack developer Где прочесть мой код? https://github.co...
Magic
11
где собака, админ группы? нычкуется и боится проявить волю, в толерантность еще не наигрался? @yelizariev
Ognezar
61
Приветствую всех, возникла проблема, до этого писал бота в простом формате где при выполнении условий приходило через send_message информация, сейчас решил добавить хендлер на...
Andrew
4
Приветствую всех, есть вопросик. Передали проект на OctoberCms, без инсталяшки в полуразвернутом виде, нужно было залить бекап бд, после залития бд, оказалось, что части строк...
Лео
14
Всем привет, может уже кто-то пытался выдернуть из api информацию о дате рождения пользователя Есть ли вообще такая возможность?
Artem Stormageddon
2
Можешь посмотреть где именно вылетает floodwait чаще всего? Просто при 1 входящем, 1 исходящем не должно быть проблем
Артем Уколов
1
Ребят, привет. У кого-то есть опыт заказа мерча в сторе? Есть успешные кейсы? Чёт у меня турецкую карту не принимает
Vladimir F.
7
Можно ли отследить отправление местоположения именно по кнопке, чтобы 100% отправлялось текущее, а не любое выбранное?
Lencore
2
Карта сайта