Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1] 2  Все   Вниз
  Печать  
Автор Тема: транспорт для потока данных  (Прочитано 40974 раз)
0 Пользователей и 3 Гостей смотрят эту тему.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« : 16-07-2008 18:14 » 

выдумал тут для своих нужд транспорт (==протокол) , который позволяет легко определить в потоке данных границу пакетов.

Вопрос : не изобрёл ли я случайно велосипед (описание ниже)? Какие ещё способы есть для данной задачи (разделение пакетов в потоке) ?

суть транспорта:
примерно 1/8 (на самом деле - чуточку больше) бит потока выделяется под маркеры границ, 7/8 - данные.

пусть длина пакета == Len

1) Начало пакета покажет байт транспорта с 1 в седьмом бите:
1xxxxxxx ,
 где xxxxxxx - это, скажем, версия транспорта (или что угодно вообще, хоть идентификатор приёмника пакета)

2)
Len/7 == количество семёрок байтов в пакете.

Если Len/7 >0 , то для каждую семёрку данных преобразуем в 8 байт транспорта:

Код:

   0         1        2        3        4        5        6
Aaaaaaaa Bbbbbbbb Cccccccc Dddddddd Eeeeeeee Ffffffff Gggggggg

->
   0         1        2        3        4        5        6       7
0aaaaaaa 0bbbbbbb 0ccccccc 0ddddddd 0eeeeeee 0fffffff 0ggggggg 0GFEDCBA

нули в седьмых битах показывают, что это данные.

3)
далее, если Len%7 >0 , то также раскидываем остаточные байты:

Код:

   0         1        2
Aaaaaaaa Bbbbbbbb Cccccccc

->
   0         1        2        3
0aaaaaaa 0bbbbbbb 0ccccccc 00000CBA

Извлечение данных из транспорта описывать по моему не нужно ))
« Последнее редактирование: 17-07-2008 07:17 от Алексей1153++ » Записан

Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 17-07-2008 06:31 » 

Зачем изобретать велосипед?
Есть открытый для всех модбас
А потом - а если нужно в данных передать и старший бит?

Чем хорош твой - твои данные передаются последовательно с возможной задержкой между блоками

Для модбаса Синхронизацией  служит время отсутствия передачи (3.5 - 4 байта)
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 17-07-2008 06:59 » 

Леш, а цель какая?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 17-07-2008 07:15 » 

Слав,
Цитата
А потом - а если нужно в данных передать и старший бит?
легко - это делается итак , передаётся всё один к одному

что есть модбаса ? И да, у меня время передачи по барабану

Ром, цель -
1) передать пакеты по хрен знает какого качества каналу по протоколу TCP/IP ,
2) распознать в программе-получателе, что это для неё данные (хотя бы по транспорту)
3) возможность чтения потока кусками - обрабатываться будут только полностью полученные пакеты
Записан

McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #4 : 17-07-2008 07:25 » 

Алексей1153++, модбас -- это такой протокол передачи данных в промышленности в основном используется.

А что мешает без изобретения протокола передавать данные? TCP/IP не позволяет? (даже если хрен знает какой канал связи). ИМХО, обычное клиент-серверное приложение.
« Последнее редактирование: 17-07-2008 07:27 от McZim » Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 17-07-2008 07:26 » 

1. TCP обеспечивает тебе доставку потока данных. Понятия пакет нету. Непринятых данных тоже нет, но возможен обрыв соединения.
2. IP+PORT = адрес программы.
3. см. п.1

Леш, толи ты большущий лисопед изобретаешь, либо я не понимаю тебя.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #6 : 17-07-2008 07:47 » 

TCP - обеспечивать то он обеспечивает, да только в сокет всё приходит в виде потока (а ещё и передать могут кусками на той стороне). Как отделить пакеты ? Вот для этого я использую транспорт. И спрашиваю - так ли это делается или есть проще способ ?
Записан

Вахмурка
Помогающий

ru
Offline Offline
Пол: Мужской
Программист


WWW
« Ответ #7 : 17-07-2008 09:26 » 

 Ну например первые два байта будут показывать длинну пакета. Потом идут байты данных, контрольная сумма и т. д. Только это зачем?
Записан

Программа – это мысли спрессованные в код.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #8 : 17-07-2008 09:45 » 

Вахмурка, хе хе хе, а ежели это был не размер, а невменяемый мусор ? Улыбаюсь Что дальше делать бы стал ?
Записан

Вахмурка
Помогающий

ru
Offline Offline
Пол: Мужской
Программист


WWW
« Ответ #9 : 17-07-2008 09:57 » 

  Алексей1153++, в TCP давно всё придумано. Получив норамальный пакет клиент отправляет источнику пакет потверждения. Если сточник не получил пакет потверждения, то передача пакета повторяется. Иначе надёжная передача вообще не могла бы быть. Так же можно сделать и сдесь.
« Последнее редактирование: 17-07-2008 09:59 от Вахмурка » Записан

Программа – это мысли спрессованные в код.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #10 : 17-07-2008 10:11 » 

не канает, я работаю не напрямую с TCP же , класс мне отдаёт просто поток данных, он сам с сетевыми делами работает
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #11 : 17-07-2008 10:12 » 

я имею в виду, что не могу туда сюда подтверждения гонять - мне должен просто поток приходить, из которого выцепляю пакеты
Записан

RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #12 : 17-07-2008 14:01 » 

Леш, подсистема TCP за тебя все это делает.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #13 : 17-07-2008 15:24 » 

Цитата: Алексей1153++
да только в сокет всё приходит в виде потока (а ещё и передать могут кусками на той стороне). Как отделить пакеты ?
А зачем? На входе некий поток, на выходе - тоже. Транспортировка, контроль доставки и кромсание на IP-пакеты "прозрачны" для передаваемого потока (в том числе автоматически исправляются потери в пути, доставка разными маршрутами, перепутывание порядка пакетов и т.д.). Случиться может только одно - полный выход канала связи из строя. Но и на этот случай на уровне IP предполагается наличие разных маршрутов доставки в обход проблемных участков (если сеть построена с учётом таких проблем).

И вообще TCP/IP разрабатывался с расчётом на работу в условиях ядерной войны Улыбаюсь.

Если же у тебя на входе в поток пишут чёрт знает что, то проблема тут отнюдь не в транспорте.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #14 : 17-07-2008 17:10 » 

как-то всё у вас всех просто выходит Улыбаюсь А у меня проблема была - отделить пакеты друг от друга. Теперь нету проблемы Улыбаюсь
Записан

Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #15 : 17-07-2008 19:12 » 

Я понимаю проблемы Лешки
Есть некий девайс, возможно тормознутый, и мозгов  у него мало, и возможностей для организации канала. Девайс может поддерживать, например, только последовательную передачу. О каком тисипи может быть речь?
Вот и лиспед появился. Со временем, я думаю, эта проблема исчезнет, и все устаканится и завернется в тисипи, но отладить нужно сейчас. Леха! дерзай!
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #16 : 17-07-2008 19:20 » 

дык с прибором то только так и поступаем , самое смешное - именно передача по сети: использую MFC-шный класс CAsyncSocket , в виртуальном методе OnReceive (событие - что то пришло) считываю полученные данные через Receive . Если не применять транспорт, а пакеты - разной длины, то всегда натыкаюсь на ситуацию, когда считана только часть какого то пакета (остальное ещё ожидает считывания). А какой там нафик подсчёт CRC (а про длиннновые байты - вообще отдельная тема), если неизвестен конец пакета ? Анализировать это всё слишком накладно, а транспорт чётко делит пакеты
Записан

McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #17 : 17-07-2008 19:27 » 

Sla, дык Лехе нужно передать данные по протоколу тисипиАЙпи.
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #18 : 17-07-2008 19:31 » 

McZim, итак по нему передаётся, всё замечательно доходит от одного компа к другому, проблема то не в этом )))

вот и ощущение такое, что у меня одного такая проблема, видимо я что то упускаю из вида ?
Записан

x77
Команда клуба

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #19 : 27-07-2008 21:01 » 

Вахмурка, хе хе хе, а ежели это был не размер, а невменяемый мусор ? Улыбаюсь Что дальше делать бы стал ?

а если у "мусора" в седьмом бите единица? что ты тогда будешь делать? я, честно сказать, тоже не понимаю Улыбаюсь
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #20 : 28-07-2008 03:15 » 

легко:
1) если я ожидаю маркер начала пакета (1 в 7 бите) , я начну принимать пакет (при чём, остальные семь битов должны быть обычно версии, скажем это число 5. Но, ладно, пусть даже там не только версия) Далее должны идти только нули в седьмых битах.
2) если пакет уже был начат, то очередной маркер начала говорит о том, что паке считан - отдаём на обработку
--
а в случае с байтами размера по любому пришлось бы сначала все N байт скачать , чтобы понять, что это косяк. А если это была ошибка ? А если внутри этого блока были 1000 правильных коротких сообщений ?
Записан

zubr
Гость
« Ответ #21 : 28-07-2008 03:54 » 

Когда то я делал подобное (городил свой протокол обмена) - таковы были требования заказчика.
Протокол был простой:
1. Постоянная длина пакета, которую знает 2 стороны.
2. В заголовке пакета (8 байт) контрольная сумма и номер пакета.
3. Отправляющая сторона посылает пакет и ждет подтверждения (короткого пакета Ok)
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #22 : 28-07-2008 04:30 » 

когда длина постоянная - было бы проще, но тут длина от 10 байт до 65к+
Записан

Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #23 : 28-07-2008 06:18 » 

Алексей1153++, я че подумал, фигня все это...
работай малыми пакетами - и не будет лисапета...

Единственно, что интересно в твоем протоколе, так это независимость от скорости канала, но тогда у тебя в канале должен гулять ТОЛЬКО один пакет
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #24 : 28-07-2008 07:08 » 

Слав,
Цитата
работай малыми пакетами
низя ( одна из передающих сторон - железяки, которые или нельзя или трудно менять

Цитата
но тогда у тебя в канале должен гулять ТОЛЬКО один пакет
- пояснение требуется. Пакетов уже не один, их много, в чём ты видишь ограничение ?
Записан

zubr
Гость
« Ответ #25 : 28-07-2008 08:29 » 

Цитата
когда длина постоянная - было бы проще, но тут длина от 10 байт до 65к+
Тогда ставь на конец пакета спецсимвол. Если внутри пакета попадаются спецсимволы удваивай их. Если количество символов нечетное - конец пакета.
По спецсимволу определил пакет, прочитал заголовок, проверил контрольную сумму.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #26 : 28-07-2008 09:08 » 

zubr, возможно, это тоже решение.
Остаётся только проблема с мусором. А ещё - какой бы символ не был выбран за маркер, существует вероятнось, что этого символа в данных может оказаться много Улыбаюсь Как тут быть ?
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #27 : 28-07-2008 09:10 » 

ну и контроль по версиям нельзя сразу сделать, кстати
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #28 : 28-07-2008 09:16 » 

zubr. хотя, в принципе, если данные сжаты, скажем, LZ, то значения байтов распределены примерно одинаково, то есть вероятность любого символа на 256 байт == около 1/256 . Тогда блок увеличится в среднем на 100/128 == 0,78 % Улыбаюсь Надо будет попробовать как-нибудь и статистику пособирать

Но, опять же, вкусный мне контроль по версиям не получится - придётся считывать и раскодировать данные сначала Улыбаюсь
« Последнее редактирование: 28-07-2008 09:18 от Алексей1153++ » Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #29 : 29-07-2008 10:27 » new

в общем, выбор стоит так:
1) предложенное Зубром (удвоение маркера) - стОит использовать, когда какой то байт заведомо реже других встречается. Менять для каждого пакета это значение нельзя (в принципе можно, но это затраты времени вычисления наименее частого символа, затем посылка "установочного" пакета, который задаст новый маркер, после чего приёмная сторона будет пользоваться новым маркером). "Универсальным" такой протокол не будет - кпд у него непредсказуемо меняется от 100% до 50%
2) если пользовать транспорт с маркером в седьмом бите, то кпд всегда 87,5% или чуть поменьше (зависит от средней длины пакета)

люблю, когда всё равномерно работает Улыбаюсь Мне больше нравится №2 , хотя он и сложнее, чем №1
Записан

Страниц: [1] 2  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines