![]() |
|
Модераторы: feodorv |
![]()
|
|
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 3 Всего: 211 |
Добрый день,
Нужно разработать протокол коммуникации клиент-серверного приложения. отправлятся будут как текстовые так и бинарные сообщения, размышляю над несколькими вариантами решения 1. Разделить сообщения на 2 типа, текстовое и бинарное, отправлять в заголовке флаг для типа сообщения 2. Отправлять всегда текстовое и делать преобразование при отправлении/получении недостатки 1 метода сервер кросс-платформенный и возможна проблема в будущем с big-endian, little-endian, так как клиент не знает на чем стоит сервер, а сервер не знает на чем стоит клиент. Можно обменятся этими данными, но тогда замучаюсь с преобразованиями. недостатки 2 метода перегружается сервер лишними конвертациями и парсингом, производительность сервера - критический параметр. К тому же увеличивается протокол обмена данными. т.е. в первом случае чтоб отправить число 25 - хватит 1 байта, во втором нужно 3 (2 байта для текста, 1 для сепаратора). Есть идеи как можно красиво и без потерь реализовать кроссплатформенный протокол? В принципе обработчики тесктовых и бинарных совершенно разные, текстовые обрабатывает сервер, бинарные отдает плагинам в DLL. Такое разделение возможно придаст немного гибкости решению. Заранее спасибо |
|||
|
||||
| GrayCardinal |
|
||||
|
Фигасе ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3039 Регистрация: 9.11.2003 Репутация: 3 Всего: 58 |
ИМХО. если
речи о конвертации бинарных данных в текстовые и обратно речи быть не может.
Не вижу проблемы... |
||||
|
|||||
| azesmcar |
|
||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 3 Всего: 211 |
получаем заголовок сообщения, проверяем тип сообщения, получаем остальное. клиент при подключении отправляет цифру - 1 к примеру, смотрим равно ли то что отправил клиент 1 или нет, если равно значит ничего переворачивать не надо, если нет - значит переворачиваем. Получаю
тогда надо ковертировать и short и int, еще теоретически возможна разница в размерах int на сервере и клиенте..тогда вообще непоятно что получается, да и код немного нечитабельный выйдет. |
||||
|
|||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 5 Всего: 154 |
просто ты принимаешь за данность, что у тебя все бинарные данные в твоем протоколе имеют определенный endianess, на тех платформах, на которых оно совпадает с endianess платформы - ничего не делаешь, та нех, на которых не совпадает - преобразуешь...
зы я бы посмотрел в сторону protocol buffers |
|||
|
||||
| azesmcar |
|
||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 3 Всего: 211 |
можно и так, но тогда и клиенту придется конвертировать в случае чего, хотя это не так уж важно, а что делать с размерами int?
Посмотрел, немного помучаю сегодня, но не думаю что это вариант..по любому это конвертация из бинарных в текстовые и обратно..а это замедлит процесс обработки сообщений.. |
||||
|
|||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 5 Всего: 154 |
нет там никакой конвертации
ничего, тебе нужно будет использовать типы данных имеющие одинаковый размер, с помощью typdef их получить не сложно |
|||
|
||||
| azesmcar |
|
||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 3 Всего: 211 |
вчера не смог, интернет отключили..сегодня дома посмотрю поподробнее.
например как? мне нужен int (т.е. 32 бита) для какого типа данных С++ гарантирует 32 бита? |
||||
|
|||||
| GrayCardinal |
|
|||
|
Фигасе ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3039 Регистрация: 9.11.2003 Репутация: 3 Всего: 58 |
azesmcar,
Да вроде Си гарантирует int - 32 бита |
|||
|
||||
| azesmcar |
|
||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 3 Всего: 211 |
Если я правильно помню стандарт гарантирует short<=int<=long но точной гарантии на размер он однозначно не дает Добавлено @ 15:29 в принципе скорость работы сервера критична, но не настолько чтоб отбросить этот вариант как совсем невероятный. Если это придаст красоту решению и не очень сильно воздействует на скорость работы - можно..но не желательно написал конвертер to_int из текста, протестировал, вроде работает на порядок быстрее чем циклом. Но обратное преобразование тоже нужно, а там деления идут..хочется добится поддержки как можно большего количества одновременных соединений
Это сообщение отредактировал(а) azesmcar - 18.3.2009, 15:30 |
||||
|
|||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 5 Всего: 154 |
а почему у меня на ATmega128 sizeof(int) был равен двум?
int32_t, int16_t, int8_t etc можно сделать отдельный заголовочный файл в котором определить подобные типы для разных платформ Добавлено через 2 минуты и 7 секунд он дает гарантии для диапазона значений, которые могут вмещать фундаментальные типы данных |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 3 Всего: 211 |
в принципе я сейчас не могу предугадать все варианты |
|||
|
||||
| GrayCardinal |
|
||||
|
Фигасе ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3039 Регистрация: 9.11.2003 Репутация: 3 Всего: 58 |
Хм. Я как-то не удосуживался это проверить. Всё больше на асме... А раз sizeof(int) двум... Что ж, очень жаль :( Добавлено @ 15:59
Так это ж stdint.h подключаешь и получаешь эти типы... если не ошибаюсь... Это сообщение отредактировал(а) GrayCardinal - 18.3.2009, 15:59 |
||||
|
|||||
![]()
|
| 1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Сети | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |