Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Socket принимает данные не полностью.
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. Переписываю один проект под Qt. Читаю данные из сокета(QTcpSocket) по сигналу readyRead. Но не могу понять одно, почему данные приходят не полностью. Вернее сами данные приходят, то полностью но как-то частями что ли... К примеру сервер посылает такие данные(очередность пакетов): 1.Привет 2.Как пауза в отправке данных 3.Дела Пока не будет отправлен пакет #3 я не увижу данных пакета 1 и 2. Пробовал устанавливать буфер setReadBufferSize но это ничего не дает. Как я понимаю тут как только приходят данные, то срабатывает сигнал readyRead? Но почему тогда происходит такая ситуация? Код: sql 1. 2. 3. 4. 5. Ранее я работал с сокетами в Java и C# и делал так и без проблем получал все порции данных сразу, даже если приходила часть отправленного пакета: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. Как сделать подобное в QT5? Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2013, 08:41 |
|
||
|
Socket принимает данные не полностью.
|
|||
|---|---|---|---|
|
#18+
GorloPavel, Пока не будет отправлен пакет #3 я не увижу данных пакета 1 и 2 Это буферизация, надо на посылающей стороне делать flush по окончании пакета. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2013, 11:21 |
|
||
|
Socket принимает данные не полностью.
|
|||
|---|---|---|---|
|
#18+
GorloPavel...сервер посылает такие данные(очередность пакетов).... судя по вопросу - не понимание протокола который юзаете. НЕТ пакетов на TCP уровне ну НЕТУ!!! хоть плач... изучайте данный уровень (круглый) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2013, 15:21 |
|
||
|
Socket принимает данные не полностью.
|
|||
|---|---|---|---|
|
#18+
kolobok0GorloPavel...сервер посылает такие данные(очередность пакетов).... судя по вопросу - не понимание протокола который юзаете. НЕТ пакетов на TCP уровне ну НЕТУ!!! хоть плач... изучайте данный уровень (круглый) Он вероятно имел в виду пакеты уже верхнего уровня, уровня протокола приложения. Типа как в HTTP GET/PUT. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2013, 15:35 |
|
||
|
Socket принимает данные не полностью.
|
|||
|---|---|---|---|
|
#18+
MasterZivkolobok0пропущено... судя по вопросу - не понимание протокола который юзаете. НЕТ пакетов на TCP уровне ну НЕТУ!!! хоть плач... изучайте данный уровень (круглый) Он вероятно имел в виду пакеты уже верхнего уровня, уровня протокола приложения. Типа как в HTTP GET/PUT. Так и есть. У меня свой протокол в приложении. Помогло вот это: Код: plaintext 1. 2. 3. 4. 5. Все равно всем спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2013, 15:41 |
|
||
|
Socket принимает данные не полностью.
|
|||
|---|---|---|---|
|
#18+
GorloPavel, Я не понял, а где flush ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2013, 17:08 |
|
||
|
Socket принимает данные не полностью.
|
|||
|---|---|---|---|
|
#18+
MasterZiv...а где flush ? сеанс телепатии закончился не удачно? ) не удержался, сорри... (круглый) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2013, 18:13 |
|
||
|
Socket принимает данные не полностью.
|
|||
|---|---|---|---|
|
#18+
GorloPavel...Помогло вот это.. возможно до поры, до времени :) пока не нагрузится сеть или сервак или клиент... оно конечно же без вашей реализации вот этого Код: plaintext 1. сказать сложно, но сдаётся мне что Вы там не ожидаете половинку поля на приёме :)) удачи вам, она Вам потребуется в гаданиях по луне (круглый) ЗЫ Даже флэш - не поможет во всех случаях!!! ЗЫ ЗЫ Всё дело в волшебных пузырьках, и как разливать в них живительную влагу способе юзанья. Если Вы воспринимаете, что на уровне сокетов(а именно так Вы задали вопрос, а не о каких то там слоях распологающихся выше!) Вы ожидаете поток - работать будет (флэш тут будет выступать в роли оптимизации по скорости передачи). А вот если думаете, что прийдёт размер от некоего буфера(если ещё Вы ожидаете его асинхронно, и не фиксированную длину хедэра пакета!!!) - то тут Вы глубоко ошибаетесь. Оно может отдать: и один байт, и сразу два пакета(если нет синхронизации на логическом уровне!!!). Вот о чём речь. Т.е. пинганули(или читай начали скачивать по фтп пару гигоффф) Ваш сервак не 10 юзверей, а 100 000 и привет семье - суши вёсла. Если Вы делаете не хэйлох-ты мир, то мучение тому пользователю, что будет юзать сей творческий Ваш посыл... вот такие дела... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2013, 18:26 |
|
||
|
Socket принимает данные не полностью.
|
|||
|---|---|---|---|
|
#18+
kolobok0GorloPavel...Помогло вот это.. возможно до поры, до времени :) пока не нагрузится сеть или сервак или клиент... оно конечно же без вашей реализации вот этого Код: plaintext 1. сказать сложно, но сдаётся мне что Вы там не ожидаете половинку поля на приёме :)) удачи вам, она Вам потребуется в гаданиях по луне (круглый) ЗЫ Даже флэш - не поможет во всех случаях!!! ЗЫ ЗЫ Всё дело в волшебных пузырьках, и как разливать в них живительную влагу способе юзанья. Если Вы воспринимаете, что на уровне сокетов(а именно так Вы задали вопрос, а не о каких то там слоях распологающихся выше!) Вы ожидаете поток - работать будет (флэш тут будет выступать в роли оптимизации по скорости передачи). А вот если думаете, что прийдёт размер от некоего буфера(если ещё Вы ожидаете его асинхронно, и не фиксированную длину хедэра пакета!!!) - то тут Вы глубоко ошибаетесь. Оно может отдать: и один байт, и сразу два пакета(если нет синхронизации на логическом уровне!!!). Вот о чём речь. Т.е. пинганули(или читай начали скачивать по фтп пару гигоффф) Ваш сервак не 10 юзверей, а 100 000 и привет семье - суши вёсла. Если Вы делаете не хэйлох-ты мир, то мучение тому пользователю, что будет юзать сей творческий Ваш посыл... вот такие дела... Все это делает обработка_данных(dataBuffer, receivedBytes); 4 байта заголовок пакета(размер), остальное "полезные" данные... Вообщем все предусмотрено... Вообщем все отлично :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2013, 04:38 |
|
||
|
Socket принимает данные не полностью.
|
|||
|---|---|---|---|
|
#18+
MasterZivGorloPavel, Я не понял, а где flush ? А где тут отправка данных, после которого должен быть flush? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2013, 04:39 |
|
||
|
Socket принимает данные не полностью.
|
|||
|---|---|---|---|
|
#18+
GorloPavel, На отправляющей стороне. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2013, 07:39 |
|
||
|
Socket принимает данные не полностью.
|
|||
|---|---|---|---|
|
#18+
MasterZivGorloPavel, На отправляющей стороне. Хахаха. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2013, 13:20 |
|
||
|
Socket принимает данные не полностью.
|
|||
|---|---|---|---|
|
#18+
Сигнал onReadyRead испускается на каждую порцию данных которая вам пришла, эти данные надо вычитывать до конца и собрать вместе. Общий размер данных вычитывается из хедера http запроса. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 11:47 |
|
||
|
|

start [/forum/topic.php?fid=57&fpage=68&tid=2019828]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
42ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
| others: | 302ms |
| total: | 431ms |

| 0 / 0 |
