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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Работа с данными  (Прочитано 2493 раз)
demaker
Птица говорун
*****
Offline Offline

Сообщений: 962


Просмотр профиля
« : Июнь 16, 2011, 14:01 »

Подскажите Улыбающийся Допустим я - сервер и посылаю данные в несколько пакетов (тип данных QByteArray) как мне сделать так, чтобы клиент во время получения данных с меня не послал еще один запрос??? Как сохранить целостность буффера???

можно ли сделать свою структуру типа списка:

struct Data{
                     QByteArray *ptr_arrData;
                     Data *next;
                  };

 Непонимающий
Записан
asvil
Гость
« Ответ #1 : Июнь 16, 2011, 14:09 »

Первыми двумя байтами посылать размер массива.
Записан
demaker
Птица говорун
*****
Offline Offline

Сообщений: 962


Просмотр профиля
« Ответ #2 : Июнь 16, 2011, 14:20 »

Клиент сам заранее знает сколько он с меня хочет считать. Мне нужно ему выдать неколько посылок с данными за один запрос,  как мне грамотно ему обознчить что это начало, а это конец, чтобы он мог их соединить корректно??? Начало понятно, что я ему вышлю код команды на его запрос и поехали и буду слать в буффер у которого объем ограничен. Хочу понять как грамотно сделать связь между посылками и обозначить их окончание на запрос, что готов к следующему???
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #3 : Июнь 16, 2011, 14:21 »

Имхо, лучше адаптируй какой нить протокол обмена типа XModem и т.п. под себя, или же сам придумай алгоритм обмена сообщениями при передаче данных.

Например,

клиент
запрашивает какие то данные,
кадром с форматом (в hex):
<старт байт><код запрашиваемых данных><стоп байт>
например: 68 33 16
где:
старт байт = 68h
код = 33h
стоп байт = 16h

сервер,
приняв этот пакет, проверяет его на старт, стоп, и на код данных
и если всё правильно, то начинает слать клиенту данные, например в таком виде:
<старт байт><контрольный байт><длина данных><данные><стоп байт>
где
старт байт, стоп байт - аналогично
контрольный байт (в битах) :
бит 7 = 1 - значит этот кадр - начало данных (т.е. первый кадр)
бит 6 = 1 - значит кадр - конец данных (т.е. последний)
если все биты в единице - значит кадр не первый и не последний
биты 5-4 - резерв
биты 3-0 - номер последовательности (номер кадра) от 0 - до 15
Сервер при передаче следующего кадра увеличивает номер кадра на единицу.

Клиент, получив кадр от сервера проверяет его на старт/стоп байты, на биты в контрольном байте и,
если кадр валидный - то извлекает из него пользовательские данные и шлет серверу кадр "положительная квитанция" (ACK)
иначе - шлет NACK

Формат ACK/NACK придумай сам.

Если сервер принял ACK - то он передает следующий кадр, если NACK - то повторяет предыдущий.

Вот, как-то так. Будет сурово и надежно Улыбающийся

 
« Последнее редактирование: Июнь 16, 2011, 14:38 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
demaker
Птица говорун
*****
Offline Offline

Сообщений: 962


Просмотр профиля
« Ответ #4 : Июнь 16, 2011, 14:39 »

Протокол есть только по нему более 250 байт нельзя полслать а мне надо заделать около 800 байт,  я хочу разбить посылку на 4 посылки, как мне это сделать грамотно??? Непонимающий
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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