1

Доброго времени суток!

При выполнении лабораторной работы столкнулся со следующей проблемой.

Инициализирую сокет следующим образом:

    soket = new QUdpSocket();
    _port = 1234;
    soket->bind(QHostAddress::Any, _port);

Осуществляю передачу файла и текста:

void MainWindow::sendMessage(QString msg)
{
    QByteArray data;
    QDataStream out(&data, QIODevice::WriteOnly);
    out << qint64(0);
    out << qint8(TYPE_MESSAGE);
    out << msg;
    out.device()->seek(qint64(0));
    out << qint64(data.size() - sizeof(qint64));
    soket->writeDatagram(data, QHostAddress::Broadcast, _port);
}

void MainWindow::sendFile(QString filePath, QString fileName)
{
    if(file != NULL)
        return;

    file = new QFile(filePath);
    if(file->open(QFile::ReadOnly)) {
        QByteArray data;
        QDataStream out(&data, QIODevice::WriteOnly);

        sendPartsOfFile();
    } else
        return;
}

void MainWindow::sendPartsOfFile()
{
    while(!file->atEnd()) {
        QByteArray block = file->read(qint64(4069));
        QByteArray data;
        QDataStream out(&data, QIODevice::WriteOnly);
        out << qint64(0);
        out << qint8(TYPE_FILE);
        out << block;
        out.device()->seek(qint64(0));
        out << qint64(data.size() - sizeof(qint64));
        soket->writeDatagram(data, QHostAddress::Broadcast, _port);
    }
    file->close();
    file = NULL;
}

И приём всего этого дела:

void MainWindow::read()
{
    QByteArray data;
    data.resize(soket->pendingDatagramSize());
    QHostAddress *address = new QHostAddress();
    soket->readDatagram(data.data(), data.size(), address);

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

    qint64 size = -1;
    if(in.device()->size() > sizeof(qint64))
        in >> size;
    else
        return;
    if(in.device()->size() - sizeof(qint64) < size)
        return;

    qint8 type = -1;
    in >> type;
    if(type == TYPE_FILE) {
        QByteArray block;
        in >> block;
        QFile newFile("tmp.png");
        if(newFile.open(QFile::Append))
            newFile.write(block);
        newFile.close();
    }
    if(type == TYPE_MESSAGE) {
        QString message;
        in >> message;

        QTextCursor cursor(ui->textEdit->textCursor());
        cursor.movePosition(QTextCursor::End);
        cursor.insertText(message);
    }
}

Сообщения приходят нормально, а вот файл по какой-то причине сохраняется неполностью (проверяю на картинке). В чем может заключаться проблема?

Также интересует каким образом лучше всего осуществить шифрование передаваемых данных и замер скорости передачи данных.

Заранее благодарю.

Свободу узникам эппла и майкрософта!

2

Особо в код не вчитывался, но с ходу водник вопрос вы уверены, что ваш файл пересылается одним пакетом?

При помощи  qDebug поглядите на число байт получаемых soket->readDatagram; посмотрите на вывод pendingDatagramSize(), и сравните эту информацию с размером файла

То что не убивает нас, делает нас сильнее! © Ницше.
When life puts you in tough situations, don’t say "why me". Just say "try me".
GNU/Linux Debian

3

Отладка показала, что происходит отправка 27мми пакетов, а принимается по какой-то причине только 25. Никак не могу понять в чем может быть причина.

Свободу узникам эппла и майкрософта!

4

Т.к. время прижало не разбирался с этим, а переписал на Python'е и всё заработало.

Свободу узникам эппла и майкрософта!