Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/21: Рейтинг темы: голосов - 21, средняя оценка - 4.76
14 / 14 / 1
Регистрация: 14.03.2015
Сообщений: 113
1

Передача файла по udp

31.03.2017, 20:29. Показов 4394. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте. Пробую передать файл с "клиента" на "сервер".
Отправка файла от клиента:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
void MainWindow::send_file()
{
    quint8 part_count = 1;
    quint8 count = file_size / part_size;
    if (count < (file_size / part_size))
        count ++;
 
    QByteArray buffer;
    QByteArray array;
    QDataStream stream(&buffer,QIODevice::WriteOnly);
    stream.setVersion(QDataStream::Qt_5_8);
    stream << quint16(0) << quint8(0) << file_size << filename << count;
    stream.device()->seek(0);
    quint16 temp2 = buffer.size() - sizeof(quint16);
    stream << quint16(buffer.size() - sizeof(quint16));
    socket->writeDatagram(buffer, server_ip, server_port);
 
    QFile file(filename);
    file.open(QIODevice::ReadOnly);
 
    for (int part = 0; !(array = file.read(part_size)).isEmpty(); part+=part_size)
    {
        stream << quint16(0) << (quint8)part_count << array;
        stream.device()->seek(0);
        quint16 temp = buffer.size() - sizeof(quint16);
        stream << quint16(buffer.size() - sizeof(quint16));
        socket->writeDatagram(buffer, server_ip, server_port);
        ui->progressBar->setValue(part);
        buffer.clear();
        array.clear();
        part_count ++;
    }
}
получение файла на сервере:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
void MainWindow::ready_read()
{
    QHostAddress sender_ip;
    quint16 sender_port;
    quint16 size;
    quint8 command;
    QByteArray buffer;
    QByteArray array;
    quint8 parts;
    quint8 part_count = 1;
 
    buffer.resize(socket->pendingDatagramSize());
    socket->readDatagram(buffer.data(), buffer.size(), &sender_ip, &sender_port);
 
    QDataStream stream(&buffer,QIODevice::ReadOnly);
    stream.setVersion(QDataStream::Qt_5_8);
    stream >> size >> command;
 
    switch (command) {
        case 0: {
            stream >> filesize >> filename >> parts;
            filename = "/home/tproo/Pictures/temp/" + QDir(filename).absolutePath();
            QFile file(filename);
            file.open(QIODevice::WriteOnly);
            file.close();
            ui->progressBar->setMaximum(filesize);
            break;
        }
        default: {
            part_count ++;
            stream >> array;
            QFile file(filename);
            file.open(QIODevice::Append);
            QDataStream file_stream(&file);
            file_stream << array;
            break;
        }
    }
}
Проблема в том, что принимает как-то не так. Первый пакет приходит нормально, совпадает и размер пакета, и данные. После первого приходит последний. Думаю что последний, потому что совпадают размеры, а вот данные не совсем. Кидаю в пакет command, чтобы знать какой пакет пришел, только вот при считывании command равен нулю.
Итого приходят только 2 пакета.
Вопрос: что я делаю не так?

Добавлено через 3 часа 25 минут
малость переделал. теперь проблема возникает, если указать большой блок. есть ограничение на объем?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.03.2017, 20:29
Ответы с готовыми решениями:

Передача с микрофона в udp и прием из udp на динамик
Собственно каким образом осуществить передачу данных с микрофона в сеть и прием из сети данных...

Приём и передача дейтаграмм по UDP
Делаю класс который передаёт файлы *bmp и *txt по UDP соединению, вопрос такой, если я делаю так ...

Передача структуры с QString по сети (udp)
Подскажите пож-а, как правильно передать подобную структуру по сети (метод writeDatagram класса...

Передача файла по протоколу UDP
Сервер передает файл клиенту если его размер файла больше 8192 байта то файл разбивается на...

3
190 / 150 / 61
Регистрация: 08.04.2010
Сообщений: 1,022
31.03.2017, 20:42 2
Размер данных в udp пакете 65527 байт.
1
14 / 14 / 1
Регистрация: 14.03.2015
Сообщений: 113
31.03.2017, 20:48  [ТС] 3
размер блока задал 10000. попробовал перекинуть файл на 1.6гб
наверное передает, только вот ошибка:
Код
 QIODevice::write (QFile, "/home/tproo/Pictures/temp/"): device not open
Добавлено через 5 минут
может ли не успевать записывать?
0
190 / 150 / 61
Регистрация: 08.04.2010
Сообщений: 1,022
31.03.2017, 22:20 4
UDP не подходит для передачи файлов, тк протокол не поддерживает их целостность, порядок доставки, а так же гарантирование доставки пакета.
1
31.03.2017, 22:20
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.03.2017, 22:20
Помогаю со студенческими работами здесь

Передача файла с помощью сокетов (UDP)
Всем привет! Пишу лабу по сокетам. Полностью задание звучит так: У меня возникла проблема с...

передача по udp
При передаче байт по протоколу udp я же могу предсказать сколько байт отправится за один раз...

Передача данных по UDP
Ребята привет. Вот такая проблема в программе. Файл отправляется в никуда.

Передача пакета по UDP
Помогите, пожалуйста, передать структуру данных с помощью компонентов Indy 9 IdUDPClient и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru