Russian Qt Forum

Qt => Работа с сетью => Тема начата: Tibr от Май 25, 2011, 13:04



Название: Проблема с отправкой картинок через QTcpSocket
Отправлено: Tibr от Май 25, 2011, 13:04
Всем привет! Нужна помощь...

Столкнулся со следующей проблемой: при попытке отправить картинку через QTcpSocket на сервер.

Код:
    QFile in("c:\\test\\pic.bmp");
    in.open(QFile::ReadOnly);
    QByteArray imageBytes = in.readAll();
    socket->write(bytesToSend);
На сервер приходит только заголовок бинарника "BM.­-". При этом вызов socket->bytesToWrite() выдаёт, что байты записаны все. Вывод в qDebug() показывает аналогичную строку - только заголовок. В чем может быть проблема и как её можно решить?

Сервер принимает только чисто бинарные данные файла (QDataStream не предлагать) :-)


Название: Re: Проблема с отправкой картинок через QTcpSocket
Отправлено: RedDog от Май 25, 2011, 14:01
Подождать пока остальные дойдут байты, не забывая при этом вычитывать из буфера сокета, что там уже есть.
Ну и отправлять лучше частями по несколько Кб что бы буфер не сильно загадить.


Название: Re: Проблема с отправкой картинок через QTcpSocket
Отправлено: Tibr от Май 25, 2011, 14:19
Подождать пока остальные дойдут байты, не забывая при этом вычитывать из буфера сокета, что там уже есть.
Ну и отправлять лучше частями по несколько Кб что бы буфер не сильно загадить.

Проблема в том, что даже вывод в дебаг:

Код:
qDebug() << bytesToSend;

Выдает только заголовок! На самом деле, считается, что с сервером всё в порядке, проблема на клиентской стороне (сервер стабильно отвечает на запросы других клиентских приложений), а то бишь в этом Qt коде.


Название: Re: Проблема с отправкой картинок через QTcpSocket
Отправлено: RedDog от Май 25, 2011, 14:21
Код:
imageBytes.size();
сколько показывает?


Название: Re: Проблема с отправкой картинок через QTcpSocket
Отправлено: Tibr от Май 25, 2011, 14:33
Код:
imageBytes.size();
сколько показывает?

Точный размер картинки в байтах. Только что проверил.


Название: Re: Проблема с отправкой картинок через QTcpSocket
Отправлено: Пантер от Май 25, 2011, 14:34
bool QAbstractSocket::waitForBytesWritten ( int msecs = 30000 )


Название: Re: Проблема с отправкой картинок через QTcpSocket
Отправлено: Tibr от Май 25, 2011, 14:41
bool QAbstractSocket::waitForBytesWritten ( int msecs = 30000 )

Подождать пока байты допишутся, и что потом?


Название: Re: Проблема с отправкой картинок через QTcpSocket
Отправлено: Пантер от Май 25, 2011, 14:42
А потом уже проверять.


Название: Re: Проблема с отправкой картинок через QTcpSocket
Отправлено: Tibr от Май 25, 2011, 14:43
А потом уже проверять.

А я думал, что сокет отправляется только после того как данные дописываются, разве не так?


Название: Re: Проблема с отправкой картинок через QTcpSocket
Отправлено: Tibr от Май 25, 2011, 14:46
Код:
qDebug() << socket->(bytesToSend);
Возвращает точно сколько нужно. Вообще ничего не понимаю...


Название: Re: Проблема с отправкой картинок через QTcpSocket
Отправлено: LisandreL от Май 25, 2011, 15:16
А я думал, что сокет отправляется только после того как данные дописываются, разве не так?
Нет. Более того юольшие объёмы данных будут автоматически разбиваться на пакеты.


Название: Re: Проблема с отправкой картинок через QTcpSocket
Отправлено: merke от Май 25, 2011, 15:49
ты лучше покажи, как ты всё это принимаешь на стороне сервера.
стопудняк приём касячит


Название: Re: Проблема с отправкой картинок через QTcpSocket
Отправлено: merke от Май 25, 2011, 16:11
Вообще по-сути если хочешь передавать большие объемы данных, а не просто команды, то или воспользуйся QDataStream, либо разработай свой протокол передачи данных. Данные придется передавать пакетами, фиксированной длины, а принимающая сторона должна будет накапливать эти пакеты и склеивать в один файл. Изначально передай просто размер файла, как только размер получен принимающей стороной, начинай слать файл пакетами, как только весь файл передан, отсылай команду окончания передачи и на эту команду принимающая сторона должна сверится с начальным полученным размером и с конечным, если они совпадают склеить файл, а в противном случае, отослать команду для повторной перессылки файла.


Название: Re: Проблема с отправкой картинок через QTcpSocket
Отправлено: Tibr от Май 25, 2011, 16:23
Всё исправил. Спасибо, Пантер!

Тема закрыта.