Russian Qt Forum
Октябрь 18, 2017, 03:20 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Передача файлов по tcp  (Прочитано 651 раз)
demaker
Гипер активный житель
*****
Offline Offline

Сообщений: 898


Просмотр профиля
« : Август 07, 2017, 20:41 »

Хочу передать файл по TCP. Сначала передаю размер файла.
Затем разбиваю его поблочно(по 1024) и передаю.
Код:
...
char arrBlock[1024];
while(!file.atEnd())
{
file.read(&arrBlock,1024);
socket->write(&arrBlock,1024);
}
...

Я так понимаю в последнем блоке в конце будет мусор.
Код:
int nblocks = sizeFile/1024;
1024 -(sizeFile - nblocks*1024) // размер мусора в последнем блоке.
Как мне его отсечь???


« Последнее редактирование: Август 07, 2017, 20:43 от demaker » Записан
Apktyc
Чайник
*
Offline Offline

Сообщений: 78


Просмотр профиля
« Ответ #1 : Август 07, 2017, 21:05 »

А зачем вообще делать так? Размер пакета все равно определит протокол.
А так QByteArray::chop
Записан
demaker
Гипер активный житель
*****
Offline Offline

Сообщений: 898


Просмотр профиля
« Ответ #2 : Август 07, 2017, 21:52 »

А зачем вообще делать так? Размер пакета все равно определит протокол.
А так QByteArray::chop
А как тогда?
типа
Код:
socket->write(file.readAll());
Можете привести пример Строит глазки
« Последнее редактирование: Август 07, 2017, 22:04 от demaker » Записан
qate
Супер активный житель
*****
Offline Offline

Сообщений: 726


Просмотр профиля
« Ответ #3 : Август 07, 2017, 22:55 »

если файл небольшой, то можно и socket->write(file.readAll());
если гигабайты, то либо свой протокол, разбивая по кускам размером в N мегабайт, тогда и прогресс будет на обоих концах
можно посмотреть как делают передачу такие программы как scp
можно торрент, но затык в начале будет, но удобно когда надо раздать 2м и более
Записан
demaker
Гипер активный житель
*****
Offline Offline

Сообщений: 898


Просмотр профиля
« Ответ #4 : Август 08, 2017, 08:16 »

если файл небольшой, то можно и socket->write(file.readAll());
если гигабайты, то либо свой протокол, разбивая по кускам размером в N мегабайт, тогда и прогресс будет на обоих концах
можно посмотреть как делают передачу такие программы как scp
можно торрент, но затык в начале будет, но удобно когда надо раздать 2м и более


А вот я в начале привел пример поблочной передачи.
Так норм или нет?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3819



Просмотр профиля
« Ответ #5 : Август 08, 2017, 08:24 »

Код
C++ (Qt)
while( !file.atEnd() )
{
   const QByteArray buf = file.read( 1024 );
   socket->write( buf );
}
 
Записан
qate
Супер активный житель
*****
Offline Offline

Сообщений: 726


Просмотр профиля
« Ответ #6 : Август 09, 2017, 10:43 »

А вот я в начале привел пример поблочной передачи.
Так норм или нет?

для больших файлов так не норм т.к. неудобно будет без прогресса приема и передачи, без отмены
зависит от задачи
а чтобы хоть както работало пойдет вариант с qbytearray вышеуказанный
Записан
demaker
Гипер активный житель
*****
Offline Offline

Сообщений: 898


Просмотр профиля
« Ответ #7 : Август 09, 2017, 17:37 »

Ясно Улыбающийся
Спасибо.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

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