Russian Qt Forum

Qt => Вопросы новичков => Тема начата: demaker от Июня 16, 2011, 14:01



Название: Работа с данными
Отправлено: demaker от Июня 16, 2011, 14:01
Подскажите :) Допустим я - сервер и посылаю данные в несколько пакетов (тип данных QByteArray) как мне сделать так, чтобы клиент во время получения данных с меня не послал еще один запрос??? Как сохранить целостность буффера???

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

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

 ???


Название: Re: Работа с данными
Отправлено: asvil от Июня 16, 2011, 14:09
Первыми двумя байтами посылать размер массива.


Название: Re: Работа с данными
Отправлено: demaker от Июня 16, 2011, 14:20
Клиент сам заранее знает сколько он с меня хочет считать. Мне нужно ему выдать неколько посылок с данными за один запрос,  как мне грамотно ему обознчить что это начало, а это конец, чтобы он мог их соединить корректно??? Начало понятно, что я ему вышлю код команды на его запрос и поехали и буду слать в буффер у которого объем ограничен. Хочу понять как грамотно сделать связь между посылками и обозначить их окончание на запрос, что готов к следующему???


Название: Re: Работа с данными
Отправлено: kuzulis от Июня 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 - то повторяет предыдущий.

Вот, как-то так. Будет сурово и надежно :)

 


Название: Re: Работа с данными
Отправлено: demaker от Июня 16, 2011, 14:39
Протокол есть только по нему более 250 байт нельзя полслать а мне надо заделать около 800 байт,  я хочу разбить посылку на 4 посылки, как мне это сделать грамотно??? ???