?

Log in

No account? Create an account

Previous Entry Share Next Entry
SkyCat - нечто похожее на скайп. Шаг 1. С чего начинается родина.
mikelsv
Порой хочется сделать что-то хрошее... но это Россия.

Желание сделать что-то из серии i2p или чата маячила дано, но чего-то не хватало для первого шага, теперь чего-то нашлось и вот он первый шаг в светлое, так сказать, будущее.
Здесь я попробую описать разработку проекта и все, что о нем думаю...

Чего я хочу? Захватить мир? Да, но это позже. А сейчас мне хочется сделать простенькую программу для общения. В перспективе безопасного, распределенного и всего остального. А пока это первый шаг и я начинаю его с разработки протокола. Как основы для всего проекта.
Из последнего опыта, мне понравился JSON, и если бы не его текстовый формат и проблемами исходящими из этого, то он вполне бы сгодился. Поэтому я решил использовать бинарный JSON. Так же я решил отказаться от типов, посчитав их излишним усложнением. В результате будет использоваться JSON в бинарном формате с единственным типом: строки. Тем самым исключаются ненужная работа с выделением памяти. Потребуется: выделить память под данные и под структуру. Память достаточно выделить всего два раза. Нагрузка на процессор минимальна. Если требуется уменьшить обьем данных, то их можно сжать в gzip. На мой взгляд это сделает размер данных не сильно больше, чем в других бинарных представлениях, а возможно и меньше.

Структура протокола: Заголовок + Данные.
Заголовок: Размер данных, размер элементов, флаг gzip.
Данные: Количество элементов, элементы.
Элемент: флаг вложенных данных, размер ключа, размер значения, данные ключа, данные значения.
Флаг вложенных данных указывает на то, что в этом элементе есть элементы, представленные в виде: Количество элементов, данные. Таким образом строится любая структура.

Заголовок:
struct CJXParseH{
    // version, flags, elements, size, gzipsize
    unsigned int ver, flags, els, size, gsize, _nouse;
};

Флаг вложенных данных, размер ключа, размер данных.
struct CJXParseL{
    unsigned short up:1;
    unsigned short keysz:5;
    unsigned short valsz:10;
//    unsigned char key[keysz];
//    unsigned char val[valsz];
};

Структура: CJXParseH + count + CJXParseL[count].

Можно заметить, что это преждевременная оптимизация, но есть задача сделать хорошо с самого начала. Код работы с форматом уже написан и тестируется. Его объем не превышает 500 строк, а вся логика очевидна и понятна.

В логике разработки я ориентируюсь на опыт предыдущего проекта, показавший, что решения должны быть максимально простыми, понятными, логичными и обоснованными. Лишние усложнения ни к чему.

PS. В следующей серии: код формата и дальнейшие планы. Бодрые шаги к ближайшей цели - jabber.
Tags: ,