Russian Qt Forum

Qt => Работа с сетью => Тема начата: demaker от Август 07, 2017, 20:41



Название: Передача файлов по tcp
Отправлено: demaker от Август 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) // размер мусора в последнем блоке.
Как мне его отсечь???




Название: Re: Передача файлов по tcp
Отправлено: Apktyc от Август 07, 2017, 21:05
А зачем вообще делать так? Размер пакета все равно определит протокол.
А так QByteArray::chop (http://doc.qt.io/qt-4.8/qbytearray.html#chop)


Название: Re: Передача файлов по tcp
Отправлено: demaker от Август 07, 2017, 21:52
А зачем вообще делать так? Размер пакета все равно определит протокол.
А так QByteArray::chop (http://doc.qt.io/qt-4.8/qbytearray.html#chop)
А как тогда?
типа
Код:
socket->write(file.readAll());
Можете привести пример ::)


Название: Re: Передача файлов по tcp
Отправлено: qate от Август 07, 2017, 22:55
если файл небольшой, то можно и socket->write(file.readAll());
если гигабайты, то либо свой протокол, разбивая по кускам размером в N мегабайт, тогда и прогресс будет на обоих концах
можно посмотреть как делают передачу такие программы как scp
можно торрент, но затык в начале будет, но удобно когда надо раздать 2м и более


Название: Re: Передача файлов по tcp
Отправлено: demaker от Август 08, 2017, 08:16
если файл небольшой, то можно и socket->write(file.readAll());
если гигабайты, то либо свой протокол, разбивая по кускам размером в N мегабайт, тогда и прогресс будет на обоих концах
можно посмотреть как делают передачу такие программы как scp
можно торрент, но затык в начале будет, но удобно когда надо раздать 2м и более


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


Название: Re: Передача файлов по tcp
Отправлено: Old от Август 08, 2017, 08:24
Код
C++ (Qt)
while( !file.atEnd() )
{
   const QByteArray buf = file.read( 1024 );
   socket->write( buf );
}
 


Название: Re: Передача файлов по tcp
Отправлено: qate от Август 09, 2017, 10:43
А вот я в начале привел пример поблочной передачи.
Так норм или нет?

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


Название: Re: Передача файлов по tcp
Отправлено: demaker от Август 09, 2017, 17:37
Ясно :)
Спасибо.