LINUX.ORG.RU

Qt udp


0

1

если c Tcp все понятно то вот с udp нет

переделывал код передачи и приема с tcp

пытаюсь передать файлы по udp, если вставить задержку в 30 милисекунд то примет все пакеты, а без этой задержки теряется почти все

/*SEND*/
    QUdpSocket* udpSocket = new QUdpSocket;

    udpSocket->connectToHost(QHostAddress::LocalHost,2323);
    connect(udpSocket,SIGNAL(error(QAbstractSocket::SocketError)),SLOT(slotError(QAbstractSocket::SocketError)));
    QFile file("10-the_coasters-down_in_mexico.mp3");


        QByteArray arr;
        file.open(QIODevice::ReadOnly);

        int progr = 0;
     //   m_pprb->setRange(0,file.size());

        QByteArray datagram;

        while(!file.atEnd()){
            arr = file.read(1400);
msleep(30);

            QDataStream out(&datagram, QIODevice::WriteOnly);
            out.setVersion(QDataStream::Qt_4_7);
            qApp->processEvents();

            progr +=arr.size();

            out << qint64(0);
            out << file.fileName() << progr << file.size() << arr;
            out.device()->seek(qint64(0));
              out << qint64(datagram.size() - sizeof(qint64));
            udpSocket->write(datagram);


        }

/*READ*/
        QByteArray datagram;
        datagram.resize(udpSocket->pendingDatagramSize());

        QHostAddress* address = new QHostAddress;

        udpSocket->readDatagram(datagram.data(),datagram.size(),address);

        QDataStream in(&datagram, QIODevice::ReadOnly);

        quint64 size = -1;

        if(in.device()->size() > sizeof(quint64)){
            in >> size;
        }
        else return;
        if(in.device()->size() - sizeof(quint64) < size) return;

        int progr = 0;
        QString fileName;
        quint64 maxRange = 0;

        QByteArray arr;
        in >> fileName >> progr >> maxRange >> arr;

        QFile file(fileName);
        file.open(QIODevice::Append);

        file.write(arr);
        file.close();

        m_pprb->setRange(0,maxRange);
        StepProgressBar(progr);

Ответ на: комментарий от guilder

чего странно? передаю имя файла, количество переданных байт, размер фалйа(нужно для просмотра прогресс бара) и сам файл

nexus86
() автор топика

а вообще сделайте файл вида

buffsize*«A» + buffsize*«B» + ит.п.

и смотрите снифер что реально передаётся

возможно после write надо делать flush

guilder
()

waitForBytesWritten() после write()

anonymous
()
Ответ на: комментарий от guilder

пробовал до 64000 не помогает, только быстрее передает

ни flush, ни waitForBytesWritten() ситуации не поменяли

nexus86
() автор топика
Ответ на: комментарий от guilder

как передавалось вместо 4 мб 100кб, так и передается

nexus86
() автор топика
Ответ на: комментарий от guilder

>1400 менять не пробывали?

пробывали

facepalm.jpg

anonymous
()

быдлокодер детектед

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.