Russian Qt Forum
Сентябрь 28, 2024, 00:33 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема с отправкой картинок через QTcpSocket  (Прочитано 7225 раз)
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 не предлагать) :-)
Записан
RedDog
Гость
« Ответ #1 : Май 25, 2011, 14:01 »

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

Подождать пока остальные дойдут байты, не забывая при этом вычитывать из буфера сокета, что там уже есть.
Ну и отправлять лучше частями по несколько Кб что бы буфер не сильно загадить.

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

Код:
qDebug() << bytesToSend;

Выдает только заголовок! На самом деле, считается, что с сервером всё в порядке, проблема на клиентской стороне (сервер стабильно отвечает на запросы других клиентских приложений), а то бишь в этом Qt коде.
« Последнее редактирование: Май 25, 2011, 14:21 от Tibr » Записан
RedDog
Гость
« Ответ #3 : Май 25, 2011, 14:21 »

Код:
imageBytes.size();
сколько показывает?
Записан
Tibr
Гость
« Ответ #4 : Май 25, 2011, 14:33 »

Код:
imageBytes.size();
сколько показывает?

Точный размер картинки в байтах. Только что проверил.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #5 : Май 25, 2011, 14:34 »

bool QAbstractSocket::waitForBytesWritten ( int msecs = 30000 )
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Tibr
Гость
« Ответ #6 : Май 25, 2011, 14:41 »

bool QAbstractSocket::waitForBytesWritten ( int msecs = 30000 )

Подождать пока байты допишутся, и что потом?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #7 : Май 25, 2011, 14:42 »

А потом уже проверять.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Tibr
Гость
« Ответ #8 : Май 25, 2011, 14:43 »

А потом уже проверять.

А я думал, что сокет отправляется только после того как данные дописываются, разве не так?
Записан
Tibr
Гость
« Ответ #9 : Май 25, 2011, 14:46 »

Код:
qDebug() << socket->(bytesToSend);
Возвращает точно сколько нужно. Вообще ничего не понимаю...
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #10 : Май 25, 2011, 15:16 »

А я думал, что сокет отправляется только после того как данные дописываются, разве не так?
Нет. Более того юольшие объёмы данных будут автоматически разбиваться на пакеты.
Записан
merke
Гость
« Ответ #11 : Май 25, 2011, 15:49 »

ты лучше покажи, как ты всё это принимаешь на стороне сервера.
стопудняк приём касячит
Записан
merke
Гость
« Ответ #12 : Май 25, 2011, 16:11 »

Вообще по-сути если хочешь передавать большие объемы данных, а не просто команды, то или воспользуйся QDataStream, либо разработай свой протокол передачи данных. Данные придется передавать пакетами, фиксированной длины, а принимающая сторона должна будет накапливать эти пакеты и склеивать в один файл. Изначально передай просто размер файла, как только размер получен принимающей стороной, начинай слать файл пакетами, как только весь файл передан, отсылай команду окончания передачи и на эту команду принимающая сторона должна сверится с начальным полученным размером и с конечным, если они совпадают склеить файл, а в противном случае, отослать команду для повторной перессылки файла.
Записан
Tibr
Гость
« Ответ #13 : Май 25, 2011, 16:23 »

Всё исправил. Спасибо, Пантер!

Тема закрыта.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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