LINUX.ORG.RU

QTcpSocket

 


0

3

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

Ответ на: комментарий от nanoolinux

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

pozitiffcat ★★★
() автор топика
Ответ на: комментарий от pozitiffcat

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

а где ты их читаешь? разве не в слоте?

nanoolinux ★★★★
()

Полотенчик пыхнул и ушёл.

<телепат моуд>не вызывай QApplication::processEvents из слота</телепат моуд>

unC0Rr ★★★★★
()
Ответ на: комментарий от nanoolinux

<thought-transference>
тебе надо аккумулировать пакеты в, например, QBuffer. В слоте весь текст читать не надо. Когда придёт последний пакет генерируй textTransferComplete(QBuffer) например, и стирай буфер, что бы новый текст принять. тот, кто сигнал обработает - получит весь текст.
</thought-transference>

nanoolinux ★★★★
()
Ответ на: комментарий от Chaser_Andrey

через раз смещение в байт получается у меня идет short команда short размер char* buffer иногда в команду попадает размер, иногда нет

pozitiffcat ★★★
() автор топика
Ответ на: комментарий от nanoolinux

текст для примера, а так файлы пересылаться любые должны, как узнать что принят последний пакет?

pozitiffcat ★★★
() автор топика
Ответ на: комментарий от pozitiffcat

Ну телепат совсем из меня никакой. А как в консольном приложении с циклом обработки сообщений? Код слота в студию.

unC0Rr ★★★★★
()
Ответ на: комментарий от nanoolinux

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

pozitiffcat ★★★
() автор топика
Ответ на: комментарий от pozitiffcat

слот чтения присылает не столько байт сколько я отослал, а сколько ему вздумается

Ну блин... я думал умный вопрос на ЛОРе появился, а ты просто нуб. Сделай буфер из QByteArray на приём, принятые данные пришлёпывай к концу, далее циклом выбирай принятые целиком сообщения, откусывая их от начала. Для отделения сообщений друг от друга посылай их длину в начале.

unC0Rr ★★★★★
()
Ответ на: комментарий от unC0Rr

Вот тебе пример быдлокода http://code.google.com/p/hedgewars/source/browse/QTfrontend/game.cpp#300

Первый байт - длина сообщения, дальше идёт само сообщение.

Вызывается отсюда: http://code.google.com/p/hedgewars/source/browse/QTfrontend/net/tcpBase.cpp#149 - тут как раз полученные данные к концу буфера добавляются

unC0Rr ★★★★★
()
Последнее исправление: unC0Rr (всего исправлений: 2)
Ответ на: комментарий от unC0Rr

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

pozitiffcat ★★★
() автор топика
Ответ на: комментарий от unC0Rr

все дошло.... прочитать если больше сообщения, обработать и отсеч от буфера, если меньше то добавить к буферу.

pozitiffcat ★★★
() автор топика
Ответ на: комментарий от pozitiffcat

когда нужно запустить на обработку этот буфер

Дык сравни длину пакета с длиной остатка буфера. Если файл собираешься сразу на диск писать, то заведи вместо буфера счётчик оставшихся для приёма байтов, который инициализируй длиной пакета и уменьшай на каждом приёме количеством принятых байтов.

unC0Rr ★★★★★
()
Ответ на: комментарий от pozitiffcat

Сначала добавь к буферу. Принять ты можешь и середину пакета, которую не распарсишь. А начало пакета всегда есть в буфере.

unC0Rr ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.