Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/21: Рейтинг темы: голосов - 21, средняя оценка - 4.57
1 / 1 / 1
Регистрация: 14.10.2015
Сообщений: 94

Почему теряются пакеты по UDP

23.01.2019, 13:00. Показов 4489. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, изучаю сетевое программирование на QT и вот столкнулся с проблемой, что почему-то передается только последнее сообщение, остальные он пропускает. И я не могу понять, то ли методы перезаписывают значения в сокете, то ли когда получается сообщение он просто выбирает последнее и все. Такой проблемы не наблюдается, если использовать некую задержку между передачами. И что с этим можно сделать, чтобы все сигналы принимал и если сделать, то будет ли это архитектурно правильно. Скажем, возможно лучше будет заюзать TCP.

У меня 2 программы. Первая программа. Есть окошко в нем кнопка и 3 поля. В поля ввожу любой текст и передаю это значения по UDP.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include "mainwindow.h"
#include "ui_mainwindow.h"
 
#include"windows.h"
 
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}
 
MainWindow::~MainWindow()
{
    delete ui;
}
 
void MainWindow::on_senderButton_clicked()
{
    Send(ui->lineEdit->text());
    Send(ui->lineEdit_2->text());
    Send(ui->lineEdit_3->text());
}
 
void MainWindow::Send(QString str)
{
    QByteArray dataGramm;
    QDataStream out(&dataGramm, QIODevice::WriteOnly);
 
    out<<str;
 
    dataGramm.append(str);
    socket.writeDatagram(dataGramm, QHostAddress::LocalHost,26000);
    dataGramm.clear();
}
Вторая программа. Получаю значения и вывожу их последовательно в QTextEdit.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include "mainwindow.h"
#include "ui_mainwindow.h"
 
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
 
    udpSocket.bind(26000);
    connect(&udpSocket,SIGNAL(readyRead()), this, SLOT(GetUdpPacket()));
}
 
MainWindow::~MainWindow()
{
    delete ui;
}
 
void MainWindow::GetUdpPacket()
{
    QByteArray dataGramm;
    QString text;
 
    do
    {
        dataGramm.resize(udpSocket.pendingDatagramSize());
        udpSocket.readDatagram(dataGramm.data(), dataGramm.size());
    } while(udpSocket.hasPendingDatagrams());
 
 
    QDataStream in(&dataGramm,QIODevice::ReadOnly);
    in>>text;
    ui->textEdit->setText( ui->textEdit->toPlainText()+ text + '\n');
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.01.2019, 13:00
Ответы с готовыми решениями:

Системой дропаются UDP пакеты
Есть такая ситуация. Две машины соеденины точка-точка. Одна передающая, другая принимающая. Передаются UDP пакеты. Но на принимающей...

Как функция recv() читает UDP-пакеты?
отправленный пакет с udp клиента ( при помощи функции send()) читается на сервере за один раз (при помощи функции recv()) ?? Или же как и...

Как передавать UDP пакеты через определенный интерфейс?
Приветствую! На пк есть три интерфейса eth0, eth1, eth2. Каждый интерфейс подключен к оборудованию передачи данных. Каждый...

4
725 / 224 / 73
Регистрация: 01.03.2011
Сообщений: 643
23.01.2019, 13:53
Ermitash, только на этом форуме уже десятки раз обсуждалось - UDP не гарантирует доставку пакетов. Все ваши задержки между посылками только прячут проблему, а не решают ее в принципе. Если вам важен каждый пакет, требуйте от удаленной стороны подтверждения, делайте перепосылки если нет отклика в течении установленного времени. Только все это несет в себе такой, пласт граблей, что проще поменять протокол.
Если вас устраивает поточная природа TCP - берите его.
Если на интересных вам платформах есть SCTP - лучше его.
0
1 / 1 / 1
Регистрация: 14.10.2015
Сообщений: 94
23.01.2019, 14:25  [ТС]
prik, просто хотелось бы объяснение немного получше, в плане, почему происходит потеря пакетов в моем случае. И если пакеты теряются, то как они могут теряться?? Хотя бы ссылочку, был бы очень благодарен.
0
725 / 224 / 73
Регистрация: 01.03.2011
Сообщений: 643
23.01.2019, 14:39
Ermitash, в вашем случае они скорее всего теряются в таких количествах из-за убогости внутреннего устройства loopback интерфейса в вашей ОС. Система просто не успевает отсылать/принимать пакеты. Задержки/увеличение буферов на сокете и прочие пляски облегчают, но не решают проблему. Она в самом протоколе - доставка/порядок пакетов не гарантированны. Читать можно начать с википедии, и какой-нибудь доступной вам книжки по сетям.
0
1 / 1 / 1
Регистрация: 14.10.2015
Сообщений: 94
23.01.2019, 15:18  [ТС]
prik, спасибо)

Добавлено через 11 минут
В принципе все сказанное выше является тоже правдой, однако ошибка была в том, что я запускал while(udpSocket.hasPendingDatagrams()), что уходило в цикл и выходило только тогда, когда сообщений уже не было, поэтому последние значения и выдавались. Все тема закрыта, всем спасибо)))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.01.2019, 15:18
Помогаю со студенческими работами здесь

Сервер принимает пакеты если клиент указывает неверный порт получателя UDP.
Вот возникла проблема не могу понять почему сервер принимает пакеты если клиент указывает неверный порт получателя UDP. Кто то может...

Теряются udp пакеты при отправке в цикле
Здравствуйте, коллеги! Моя проблема заключается в том, что при отправке пакетов в цикле до адресата не доходят примерно 40% пакетов....

Теряются пакеты
Теряются пакеты, иногда! минут 5 поработает нормально и на 30сек примерно начинает терять пакеты потеря пакетов состовляет - 25%...

Теряются пакеты tl-wr841nd
Использую адаптер TL-WN821N, но проблема прослеживается и с другим. Потеря пакетов при ping IP самого роутера - как я понимаю, это...

Теряются пакеты интернета
Здравствуйте , такая проблема, что с утра,примерно часов с 10 и до вечера 11-12 отключается интернет , буквально на несколько секунд и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru