crossplatform.ru

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


  Ответ в передача файла по TCP
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
DICKobraz Дата 14.8.2009, 19:46
 
Цитата(igor_bogomolov @ 12.8.2009, 22:53) *
Цитата
(int)sizeof(quint16)

Все правильною Ты сам себя ограничил 64к
максимальное значение blockSize = 0xffff, т.е. 65535 или 64k

Спасибо большое!Просто исправил на unsigned int все как надо работает!Я в начале за основу взял пример сервера передающего текстовые сообщения поэтому так и оставался 16 битовый инт.
igor_bogomolov Дата 13.8.2009, 17:55
  kuzulis,
blockSize у нас определяет, какое количество бат мы должны получить.

// здесь мы проверяем, пришло ли достаточное количество данных, чтобы считать значение blockSize
if (tcpSocket->bytesAvailable() < sizeof(int))
    return; // если не достаточно вываливаемся

// иначе считываем, в данном случае 4 байта, т.е. int
in >> blockSize;


Максимальное значение инта 4294967295. теперь мы ограничены этим количеством байт.
Ранее были ограничены 65536 байтами или 64 килобайтами
kuzulis Дата 13.8.2009, 13:37
 
Цитата
Тогда уж

int blockSize = 0;
....
....
if (tcpSocket->bytesAvailable() < sizeof(int))
return;
in >> blockSize;

а тут вы ограничиваете 4-мя байтами, т.к. sizeof(int) = 4 :) ну никак не 64K
igor_bogomolov Дата 13.8.2009, 8:58
 
Цитата(Litkevich Yuriy @ 13.8.2009, 9:37) *
будет равно 2 (байта), а не 64к
А я такого и не писал :)
Цитата
максимальное значение blockSize =

Максимальное значение которое можно записать в два байта 65535 или 65535 / 1024 = 64 к
Вот оно и ограничение.

Тогда уж
    int blockSize = 0;
    ....
    ....
    if (tcpSocket->bytesAvailable() < sizeof(int))
        return;
    in >> blockSize;
Litkevich Yuriy Дата 13.8.2009, 8:37
 
Цитата(DICKobraz @ 13.8.2009, 0:45) *
sizeof(quint16)
будет равно 2 (байта), а не 64к
igor_bogomolov Дата 12.8.2009, 21:53
 
Цитата
(int)sizeof(quint16)

Все правильною Ты сам себя ограничил 64к
максимальное значение blockSize = 0xffff, т.е. 65535 или 64k
DICKobraz Дата 12.8.2009, 20:45
  Вобщем, вот часть клиента:
QDataStream in(tcpSocket);
in.setVersion(QDataStream::Qt_4_0);
QFile file(fileName);    
file.open(QIODevice::WriteOnly);
if (blockSize == 0) {
    if (tcpSocket->bytesAvailable() < (int)sizeof(quint16))
        return;
    in >> blockSize;
}
if (tcpSocket->bytesAvailable() < blockSize)
    return;
char a[1024];
while(in.atEnd()!=true){
    int nBlockSize=in.device()->read(a,sizeof(a));
    file.write(a, nBlockSize);
}
file.close();


Любой переданый от сервера фаил обрезается до 64k.Как я понимаю проблема такая же как была описана выше,вот и хотелось бы узнать каким образом ожидать пока все пришедшие bytesavalible() данные будут готовы для чтения?
kuzulis Дата 12.8.2009, 7:44
 
Цитата
Добрый день! У меня похожая проблема с ограничением в размере,можно узнать как от нее избавится?Что-то добавить в цикл while?

Какое такое ограничение? посмотрите исходники examples\network\loopback\
DICKobraz Дата 12.8.2009, 1:27
  Добрый день! У меня похожая проблема с ограничением в размере,можно узнать как от нее избавится?Что-то добавить в цикл while?
Rastorev Дата 30.3.2009, 23:22
 
Цитата
Вы знаете, что произойдёт, если в tofile попадёт -1 ? Указывающая на то, что при получении произошла ошибка.

Вы все правильно описали что должно произойти.
Вся загвостка оказалась куда более простая чем я думал!!С принимающей стороны надо было ожидать пока все пришедшие bytesavalible() данные будут готовы для чтения
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 27.4.2024, 22:31