LinuxForum.Fans
Тема

[Qt] Передача файла через QUdpSoket с шифрованием и замерос скорости

Автор: Osanve 4 сообщений 2822 просмотров
#291512

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

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

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

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

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

text
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; }

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

text
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); } }

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

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

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

#291515

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

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

#291526

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

#291867

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

Войдите или зарегистрируйтесь, чтобы ответить.