crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> передача файла по TCP
Rastorev
  опции профиля:
сообщение 10.3.2009, 22:00
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 6
Регистрация: 27.2.2009
Пользователь №: 579

Спасибо сказали: 0 раз(а)




Репутация:   0  


Добрый день!
Программа клиент TCP должна передавать информацию о файле и сам файл на сервер TCP и отображать ответ и текущее состояние сервера
Сделано стандартно по примеру QT - обмен строковой информации между клиентом и сервером по TCP/IP происходит через открытый сокет,
теперь я пытаюсь разбить файл на блоки и передаю в сокетный поток, а на сервере принимая каждый блок сохраняю в файл, но в файл выводятся иероглифы вместо нужной информации.
Клиента код.

QFile fileopen(sourceFile);
    targetFile = QFileInfo(sourceFile).fileName();
    char block[1024];

    if (fileopen.open(QFile::ReadWrite)) {
        QByteArray arrayBlock;
        QDataStream vivod(&arrayBlock, QIODevice::WriteOnly);
        vivod.setVersion(10);
        vivod << quint16(0) << quint8('S') << targetFile;

        fileopen.seek(0);
        while(!fileopen.atEnd()) {
             quint64 in;
             in = fileopen.read(block, sizeof(block));
            vivod << in;
            }
        vivod.device()->seek(0);
        vivod << quint16(arrayBlock.size() - sizeof(quint16));
        //записываем данные в сокет
        tcpSocket.write(arrayBlock);
        }
    statusLabel->setText("Sending File...");
}

Код сервера

    QDataStream in(this);
    in.setVersion(10);
    if (nextBlockSize == 0) {
        if (bytesAvailable() < sizeof(quint16))
            return;
        in >> nextBlockSize;
    }
    if (bytesAvailable() < nextBlockSize)
        return;

    quint8 requestType;
    QString targetFile;

    in >> requestType;
    if (requestType == 'S') {
        in >> targetFile;
        generateRandomTrip(targetFile);
        QFile target(targetFile);
        if(target.open(QIODevice::WriteOnly)){
            char block[1024];

//может быть ошибка где-то сдесь

            while(!in.atEnd()) {
                quint64 tofile;
                in >> tofile;
                target.write(block,tofile);
            }
        }
        target.close();
        QDataStream out(this);
        out << quint16(0xFFFF);
        }
    nextBlockSize = 0;
    close();


Нужно сделать так чтобы сервер создавал файл и содержимое полученное от клиента получалось нормальным.
Подскажите пожалуйста, в чем ошибка? может решить эту проблему по другому? Может быть есть какие-нибудь нюансы которые я не учел?
Заранее спасибо!!!
Причина редактирования: используйте тэг code
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- Rastorev   передача файла по TCP   10.3.2009, 22:00
- - kwisp   Rastorev, почему бы не сделать в клиенте и в серв...   10.3.2009, 22:34
|- - Rastorev   не мог бы ты описать более конкретней ??   11.3.2009, 0:53
- - kwisp   Цитата(kwisp @ 10.3.2009, 22:34) QDataStr...   11.3.2009, 20:57
- - Rastorev   Но как вы реализовали передачу - наподобие "о...   15.3.2009, 23:45
- - kwisp   Цитата(Rastorev @ 15.3.2009, 23:45) И нет...   16.3.2009, 9:41
- - Rastorev   Пытаюсь передать файл.... if (fileopen.open...   16.3.2009, 22:12
- - Rastorev   Спасибо хоть и на этом...   17.3.2009, 23:02
- - ViGOur   Ты немного не так делаешь. Правильней было бы сдел...   18.3.2009, 9:04
- - LE0N   ЦитатаЯ понимаю что это целый протокол, но это не ...   18.3.2009, 10:31
|- - Rastorev   ЦитатаВы знаете, что произойдёт, если в tofile поп...   30.3.2009, 23:22
- - DICKobraz   Добрый день! У меня похожая проблема с огранич...   12.8.2009, 1:27
- - kuzulis   ЦитатаДобрый день! У меня похожая проблема с о...   12.8.2009, 7:44
- - DICKobraz   Вобщем, вот часть клиента: QDataStream in(tcpS...   12.8.2009, 20:45
- - igor_bogomolov   Цитата(int)sizeof(quint16) Все правильною Ты сам с...   12.8.2009, 21:53
|- - DICKobraz   Цитата(igor_bogomolov @ 12.8.2009, 22:53)...   14.8.2009, 19:46
- - Litkevich Yuriy   Цитата(DICKobraz @ 13.8.2009, 0:45) sizeo...   13.8.2009, 8:37
- - igor_bogomolov   Цитата(Litkevich Yuriy @ 13.8.2009, 9:37)...   13.8.2009, 8:58
- - kuzulis   ЦитатаТогда уж int blockSize = 0; .... ...   13.8.2009, 13:37
- - igor_bogomolov   kuzulis, blockSize у нас определяет, какое количе...   13.8.2009, 17:55


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.4.2024, 5:42