Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.10.2012, 11:26   #1
Артэс
Форумчанин
 
Регистрация: 05.06.2007
Сообщений: 529
По умолчанию UDP протокол :)

Здравствуйте. Возвращаясь к вопросу о UDP протоколе, кое-кого попрошу воздержаться от комментов типа "ааа ты 2 года назад спрашивал" и т.п.

Быть может существуют общие принципы системы 100% гарантии передачи данных через UDP протокол? Пока есть задумка, сделать очередь для сообщений. Перед отправкой, сообщение помещается в этот массив очереди, затем посылается, и ожидается ответ от клиента. Если ответ об успешном получении сообщения пришел - двигаемся дальше по массиву очереди, если нет - переотправляем сообщение опять. Таким образом, даже если связь пропадет на несколько секунд, а потом появится, клиент получит все сообщения, которые были помещены в массив очереди. Ну а в случае превышения очереди, скажем, 100 сообщений, дисконнект и мессага о том, что слишком долго были в лаге

Правильно ли так?
Артэс вне форума Ответить с цитированием
Старый 09.10.2012, 11:41   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> принципы системы 100% гарантии передачи данных

100% гарантии даёт только бог. Перекопает экскаватор вам оптоволокно, и привет.

А так, доставку с подтвеждением можно сделать десятком разных способов. Вопрос зачем, и на сколько это будет эффективно. Вряд ли у вас получится это сделать лучше, чем у ТСП, а делать хуже, имхо, особого смысла нет.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 09.10.2012, 11:42   #3
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

все уже придумано
http://udt.sourceforge.net/doc.html
f.hump вне форума Ответить с цитированием
Старый 09.10.2012, 11:46   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Давным давно (в далекой галактике) был такой протокол Z-Modem. Так вто там концепция была другая - отправитель посылал не ожидая подтверждения, а получатель, если чтото потерялось выдавал команду вернутся назад. Правда это было для файлов.
waleri вне форума Ответить с цитированием
Старый 09.10.2012, 12:17   #5
Rock-n-Rolla
Форумчанин
 
Регистрация: 11.01.2012
Сообщений: 177
По умолчанию

Цитата:
Сообщение от Артэс Посмотреть сообщение
Быть может существуют общие принципы системы 100% гарантии передачи данных через UDP протокол? Пока есть задумка, сделать очередь для сообщений. Перед отправкой, сообщение помещается в этот массив очереди, затем посылается, и ожидается ответ от клиента. Если ответ об успешном получении сообщения пришел - двигаемся дальше по массиву очереди, если нет - переотправляем сообщение опять. Таким образом, даже если связь пропадет на несколько секунд, а потом появится, клиент получит все сообщения, которые были помещены в массив очереди. Ну а в случае превышения очереди, скажем, 100 сообщений, дисконнект и мессага о том, что слишком долго были в лаге
слишком сложно.

Отправляем UDP-пакет, ждём 15 секунд, если подтвеждение не пришло, отправляем ещё раз, после 5 попыток делаем вывод о том, что адресат недоступен.

Либо просто посмотреть как это делается в TCP и реализовать тоже самое.
progromore.i2p - первый русскоязычный портал программистов в скрытосети
Rock-n-Rolla вне форума Ответить с цитированием
Старый 09.10.2012, 12:44   #6
Артэс
Форумчанин
 
Регистрация: 05.06.2007
Сообщений: 529
По умолчанию

Сложно? Вроде нет

Делаю активную сетевую игру, там в цикле, 20 раз в секунду посылаются пакеты. Может быть послано 5 сообщений текстовых (чат), дабы они не терялись, думаю лучше с очередью.
Артэс вне форума Ответить с цитированием
Старый 09.10.2012, 17:46   #7
LynXzp
Пользователь
 
Аватар для LynXzp
 
Регистрация: 04.10.2012
Сообщений: 95
По умолчанию

Конечно не сложно, только так будут медленно передаваться данные.
Цитата:
перед отправкой, сообщение помещается в этот массив очереди, затем посылается, и ожидается ответ от клиента. Если ответ об успешном получении сообщения пришел - двигаемся дальше по массиву очереди, если нет - переотправляем сообщение опять.
Модифицируй чтобы передавались сразу все сообщения что есть в очереди. (возможно они все в 1 пакет вообще поместятся), а если на какие-то из них не пришло подтверждения тогда высылай еще раз. И подтверждения можно высылать не на каждое сообщение, а пучком, несколько номеров перечислил в 1 пакете и все - меньшая нагрузка обратной связи.

Одно но. Велосипед хорошо, только вряд ли TCP хуже.

Кроме того если, например, скорость высокая, но потери тоже не редкость можно сразу высылать по 2 пакета с одними и теми же сообщениями. В крайнем случае - постоянно высылать все сообщения на которые не пришли подтверждения. (лучше так не делать, а то вдруг полудуплекс и ты забьешь всю сеть пакетами - ни одного подтверждения ес-но не получишь)
Пишу на чистом С, плюсы спилил.
LynXzp вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Протокол CGI Николай1 Фриланс 2 01.06.2012 23:22
Свой протокол Alex_Gordon Общие вопросы Delphi 8 07.01.2012 00:13
Как остановить SendTo (UDP протокол) Dasharnb777 Общие вопросы .NET 0 23.11.2010 23:41
рассылка сообщений всем пользователям в чате, протокол UDP RKS Работа с сетью в Delphi 14 15.12.2007 11:36