Russian Qt Forum
Ноябрь 23, 2024, 21:00 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Отправить файл по сети  (Прочитано 10495 раз)
RomiX
Гость
« : Февраль 15, 2012, 19:52 »

Плз помогите отправить файл через QTcpSocket и принять с помощью QTcpServer. Уже пол дня мучаюсь, вроде все отправляется, и приходит, но файл создаётся пустым(((
отправка: (сори за кривоватый код)

Код:
QFile file(fileName);
    if(!file.open(QIODevice::ReadOnly)) {
        // err str
        return false;
    }
    if(!socket->isValid()) {
        return false;
    }

    socket->waitForConnected();

    QDataStream read(&file);
    QByteArray arr;
    QDataStream out(&arr, QIODevice::WriteOnly);
    out.setVersion(QDataStream::Qt_4_7);
    char data[PACKET_SIZE];
    int readed;

    out << quint16(0) << QString("file") << QFileInfo(file.fileName()).fileName() << file.size();
    out.device()->seek(0);
    out << quint16(arr.size() - sizeof(quint16));

    socket->write(arr);
    socket->flush();
    while(!read.atEnd()) {
        readed = read.readRawData(*(&data), PACKET_SIZE);
        QByteArray array(*(&data), PACKET_SIZE);
        socket->write(array);
    }

Приём:
Код:
QTcpSocket *clientSocket = (QTcpSocket *)sender();
    QDataStream in(clientSocket);
    in.setVersion(QDataStream::Qt_4_7);

    qDebug() << "read" << clientSocket->bytesAvailable();
    for(;;) {
        if(!nextBlockSize) {
            if(clientSocket->bytesAvailable() < sizeof(quint16))
                break;
            in >> nextBlockSize;
        }

        if(clientSocket->bytesAvailable() < nextBlockSize)
            break;

        QString type;
        in >> type;

        if(type == "file") { // принимаем файл
            QString fileName;
            quint64 size;

            in >> fileName;
            in >> size;

            QFile file(fileName);
            if(!file.open(QIODevice::WriteOnly)) {
                qDebug() << "can't open file to write";
                return;
            }
            qDebug() << "----------" << fileName << size;

            QDataStream fileOut(&file);

            int readed;
            quint64 done = 0;
            while(done < size) {
                /*readed = 0;
                while(readed == 0)
                    readed = clientSocket->waitForReadyRead(-1);
                if(readed == -1) {
                    qDebug() << "socket err";
                    return;
                }*/

                QByteArray tmp;
                tmp = clientSocket->readAll();
                fileOut.writeRawData(tmp.data(), tmp.size());
                done += tmp.size();
                qDebug() << "writed" << tmp.size();
                break;
            }
            qDebug() << "done";
            file.close();
            return;
        } else if (type == "text") {

        }


        nextBlockSize = 0;
    }

мне кажется я чето намудрил с чтением данных из сокета
Записан
merke
Гость
« Ответ #1 : Февраль 16, 2012, 10:43 »

Извини, но какая то у тебя извращенная передача файлов. глянь на фортун сервер из примеров кутишных и сделай по примеру
Записан
RomiX
Гость
« Ответ #2 : Февраль 16, 2012, 18:38 »

так по его примеру и пытался делать, тока каким образом передать большой файл(около 10МБ)?? нельзя же его просто засунуть в сокет? или всётаки можно? (тогда все упроститься)
Записан
merke
Гость
« Ответ #3 : Февраль 16, 2012, 18:48 »

засунь, а на той стороне считывай пока не получишь весь файл
Записан
merke
Гость
« Ответ #4 : Февраль 16, 2012, 18:50 »

Код:
out << quint16(0) << QString("file") << QFileInfo(file.fileName()).fileName() << file.size() << "сам файл";
    out.device()->seek(0);
    out << quint16(arr.size() - sizeof(quint16));
Записан
RomiX
Гость
« Ответ #5 : Февраль 16, 2012, 18:58 »

интересно... и скока так получиться отправить? на скока озу хватит?
Записан
merke
Гость
« Ответ #6 : Февраль 16, 2012, 18:59 »

хоть сколько)
Записан
BRE
Гость
« Ответ #7 : Февраль 16, 2012, 19:03 »

хоть сколько)
И для хранения размера пакета хватит quint16?  Строит глазки
Записан
merke
Гость
« Ответ #8 : Февраль 16, 2012, 19:03 »

хоть сколько)
И для хранения размера пакета хватит quint16?  Строит глазки

вечерняя невнимательность) это не ко мне вопрос, а к автору)
Записан
RomiX
Гость
« Ответ #9 : Февраль 16, 2012, 19:05 »

спс, заюзаю quint64, получается файл читается порционно, по мере необходимости и не занимая много памяти?
Записан
merke
Гость
« Ответ #10 : Февраль 16, 2012, 19:10 »

спс, заюзаю quint64, получается файл читается порционно, по мере необходимости и не занимая много памяти?

ну да. а как ты это сделаешь по другому, в любом случае все придется читать паками. Просто на передающей стороне скидываешь весь объем в сокет, тот сам уже бьет на пакеты и пересылает, а на принимающей стороне достаточно получить размер ожидаемых данных и принимать до усраки, пока всё не получишь.
Записан
RomiX
Гость
« Ответ #11 : Февраль 16, 2012, 19:14 »

спс, щас попробую, а принимать получается вот так:
while(done < size) ? или как то иначе?
Записан
BRE
Гость
« Ответ #12 : Февраль 16, 2012, 19:17 »

Для такой отправки файл придется загрузить в память полностью, а это не всегда возможно, поэтому если нужна универсальность, то резать на части и отправлять частями.
Записан
RomiX
Гость
« Ответ #13 : Февраль 16, 2012, 19:38 »

частями то я отправил вроде... а вот как это дело принять потом?
Записан
BRE
Гость
« Ответ #14 : Февраль 16, 2012, 19:39 »

частями то я отправил вроде... а вот как это дело принять потом?
В смысле?
Получил кусок - дописАл в файл, получил следующий - еще дописАл. Улыбающийся
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.197 секунд. Запросов: 21.