Russian Qt Forum

Qt => Работа с сетью => Тема начата: zagruzkaaa от Октябрь 04, 2015, 03:55



Название: помогите c QUdpSocket
Отправлено: 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());
}


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

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

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


Название: Re: помогите c QUdpSocket
Отправлено: zagruzkaaa от Октябрь 04, 2015, 17:40
КОгда добавляю после отправки ответа вот такую строчку
while (getSocket->hasPendingDatagrams()==0);

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


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


Название: Re: помогите c QUdpSocket
Отправлено: qate от Октябрь 05, 2015, 16:31
Есть подозрение, что зависает где-то на записи в файл. Что скажите?

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



Название: Re: помогите c QUdpSocket
Отправлено: zagruzkaaa от Октябрь 06, 2015, 02:32
Есть подозрение, что зависает где-то на записи в файл. Что скажите?

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


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


Название: Re: помогите c QUdpSocket
Отправлено: qate от Октябрь 06, 2015, 08:38
пробовал и на винде и на линуксе.
Помогло такое решение:
поставить на цикл условие
while (getSocket->pendingDatagramSize()!=-1)

т.е. getSocket->hasPendingDatagrams() может вернуть false, а getSocket->pendingDatagramSize() вернет > 0 ?