Russian Qt Forum
Ноябрь 23, 2024, 00:32 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: помогите c QUdpSocket  (Прочитано 6161 раз)
zagruzkaaa
Гость
« : Октябрь 04, 2015, 03:55 »

Есть клиент, который посылает огромное кол-во пакетов на сервер, но только после подтверждения доставки на сервер.
Код:
Код:
...
  QByteArray datagram;
    while (!file.atEnd()) {
        datagram=file.read(1024);

       sendSocket->writeDatagram(datagram.data(), datagram.size(), QHostAddress(ip), port.toInt());
        time=QDateTime::currentMSecsSinceEpoch();
        while(getSocket->hasPendingDatagrams()==0)
        {
            if(QDateTime::currentMSecsSinceEpoch()-time>3000)
            {
                sendSocket->writeDatagram(datagram.data(), datagram.size(), QHostAddress(ip), port.toInt());
                time=QDateTime::currentMSecsSinceEpoch();
            }
        }
        getSocket->readDatagram(datagram.data(), datagram.size());
    }

и есть сервер, который все это принимает и отсылает обратно ответ о получении.
КОд:
Код:
connect(getSocket, SIGNAL(readyRead()), this, SLOT(GetData()));

void MainWindow::GetData()
{

    while (getSocket->hasPendingDatagrams()) {
                QByteArray datagram;
                datagram.resize(getSocket->pendingDatagramSize());
                getSocket->readDatagram(datagram.data(), datagram.size()/*,&sender,&senderPort*/);
                   QFile file("D:/2.mp4");
                    file.open(QIODevice::Append);
                    file.write(datagram);
                    file.close();
                    QByteArray datagram2 = "Good";
                    sendSocket->writeDatagram(datagram2.data(), datagram2.size(), QHostAddress(ip), port.toInt());
}


Возникает такая проблема: через какое-то определенное кол-во отправленных пакетов сервер перестает принимать пакеты. Т.е клиент шлет пакет, а сервер в ответ ничего. Из-за чего может быть?

Если убрать подтверждение доставки. т.е чтоб сервер не слал ответ, то почти все пакеты тупо не доходят...

Есть подозрение, что зависает где-то на записи в файл. Что скажите?
« Последнее редактирование: Октябрь 04, 2015, 04:30 от zagruzkaaa » Записан
zagruzkaaa
Гость
« Ответ #1 : Октябрь 04, 2015, 17:40 »

КОгда добавляю после отправки ответа вот такую строчку
while (getSocket->hasPendingDatagrams()==0);

то все передается нормально.
Значит проблема возникает в том что. Если программа вышла из функции обработки сигнала, она уже в нее не заходит. Почему?
Записан
torwig
Самовар
**
Offline Offline

Сообщений: 134



Просмотр профиля
« Ответ #2 : Октябрь 05, 2015, 09:13 »

Где-то полгода назад работал над приложением получения видео с IP-камер по протоколу RTSP.
После перехода на версию фреймворка 5.3 (сейчас точно не припомню) появилась вот какая штука (впервые заметил на Маке, думал это такая проблема только на этой ОС, но потом проявилось и на Винде/Убунте):
сокет принимает UDP-датаграммы, тоже идет
Код:
connect(mUdpSocket, SIGNAL(readyRead()), SLOT(onUdpSocketReadyRead()));
и буквально после 2-3 датаграмм слот больше не вызывается. Пришлось заводить таймер и по таймеру вызывать onUdpSocketReadyRead().
Не знаю в чем дело, но до этого долгое время все работало, а с какой-то новой версии перестало.
Записан
qate
Супер
******
Offline Offline

Сообщений: 1177


Просмотр профиля
« Ответ #3 : Октябрь 05, 2015, 16:31 »

Есть подозрение, что зависает где-то на записи в файл. Что скажите?

qDebug() на каждую строчку и сниффер - все станет ясно
какая ОС ?

Записан
zagruzkaaa
Гость
« Ответ #4 : Октябрь 06, 2015, 02:32 »

Есть подозрение, что зависает где-то на записи в файл. Что скажите?

qDebug() на каждую строчку и сниффер - все станет ясно
какая ОС ?


пробовал и на винде и на линуксе.
Помогло такое решение:
поставить на цикл условие
while (getSocket->pendingDatagramSize()!=-1)
Записан
qate
Супер
******
Offline Offline

Сообщений: 1177


Просмотр профиля
« Ответ #5 : Октябрь 06, 2015, 08:38 »

пробовал и на винде и на линуксе.
Помогло такое решение:
поставить на цикл условие
while (getSocket->pendingDatagramSize()!=-1)

т.е. getSocket->hasPendingDatagrams() может вернуть false, а getSocket->pendingDatagramSize() вернет > 0 ?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.087 секунд. Запросов: 22.