crossplatform.ru

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

2 страниц V  < 1 2  
Ответить в данную темуНачать новую тему
> передача файла по TCP
Rastorev
  опции профиля:
сообщение 30.3.2009, 23:22
Сообщение #11


Новичок


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

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




Репутация:   0  


Цитата
Вы знаете, что произойдёт, если в tofile попадёт -1 ? Указывающая на то, что при получении произошла ошибка.

Вы все правильно описали что должно произойти.
Вся загвостка оказалась куда более простая чем я думал!!С принимающей стороны надо было ожидать пока все пришедшие bytesavalible() данные будут готовы для чтения
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
DICKobraz
  опции профиля:
сообщение 12.8.2009, 1:27
Сообщение #12


Новичок


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

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




Репутация:   0  


Добрый день! У меня похожая проблема с ограничением в размере,можно узнать как от нее избавится?Что-то добавить в цикл while?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kuzulis
  опции профиля:
сообщение 12.8.2009, 7:44
Сообщение #13


Активный участник
***

Группа: Участник
Сообщений: 393
Регистрация: 29.6.2009
Пользователь №: 862

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




Репутация:   7  


Цитата
Добрый день! У меня похожая проблема с ограничением в размере,можно узнать как от нее избавится?Что-то добавить в цикл while?

Какое такое ограничение? посмотрите исходники examples\network\loopback\
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
DICKobraz
  опции профиля:
сообщение 12.8.2009, 20:45
Сообщение #14


Новичок


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

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




Репутация:   0  


Вобщем, вот часть клиента:
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() данные будут готовы для чтения?
Причина редактирования: Используй тэг code
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 12.8.2009, 21:53
Сообщение #15


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

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




Репутация:   29  


Цитата
(int)sizeof(quint16)

Все правильною Ты сам себя ограничил 64к
максимальное значение blockSize = 0xffff, т.е. 65535 или 64k
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 13.8.2009, 8:37
Сообщение #16


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Цитата(DICKobraz @ 13.8.2009, 0:45) *
sizeof(quint16)
будет равно 2 (байта), а не 64к
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 13.8.2009, 8:58
Сообщение #17


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

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




Репутация:   29  


Цитата(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;
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kuzulis
  опции профиля:
сообщение 13.8.2009, 13:37
Сообщение #18


Активный участник
***

Группа: Участник
Сообщений: 393
Регистрация: 29.6.2009
Пользователь №: 862

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




Репутация:   7  


Цитата
Тогда уж

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

а тут вы ограничиваете 4-мя байтами, т.к. sizeof(int) = 4 :) ну никак не 64K
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 13.8.2009, 17:55
Сообщение #19


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

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




Репутация:   29  


kuzulis,
blockSize у нас определяет, какое количество бат мы должны получить.

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

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


Максимальное значение инта 4294967295. теперь мы ограничены этим количеством байт.
Ранее были ограничены 65536 байтами или 64 килобайтами
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
DICKobraz
  опции профиля:
сообщение 14.8.2009, 19:46
Сообщение #20


Новичок


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

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




Репутация:   0  


Цитата(igor_bogomolov @ 12.8.2009, 22:53) *
Цитата
(int)sizeof(quint16)

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

Спасибо большое!Просто исправил на unsigned int все как надо работает!Я в начале за основу взял пример сервера передающего текстовые сообщения поэтому так и оставался 16 битовый инт.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 18.1.2025, 12:10