|
0 / 0 / 0
Регистрация: 05.10.2009
Сообщений: 27
|
|
Winsock2.h:udp фрагментирование данных11.10.2009, 12:07. Показов 5325. Ответов 25
Метки нет (Все метки)
Доброго времени суток!
Подскажите пожалуйста, какие можно использовать средства (функции) для фрагментации большого буфера (большой в том смысл, что не влезет в один UDP пакет) так, чтобы можно было самому дописывать некоторые данные (для обеспечения гарантии доставки) к полученным фрагментам в каждый UDP пакет? И какой длины должны быть эти фрагменты? P.S.: возможно кто-то даст ссылку, где можно посмотреть реализацию гарантированной доставки данных по UDP.
0
|
|
| 11.10.2009, 12:07 | |
|
Ответы с готовыми решениями:
25
Фрагментирование файла Передача большого объема данных по UDP UDP. Как реализовать возможность передачи разного количества данных? |
| 11.10.2009, 16:10 | |
|
если это - требование, не завидую. или почему нельзя использовать TCP ? если нельзя, то нужно самому реализовать все то же, что уже имеется в TCP: разбиение и нумерация пакетов, отслеживание доставки, запросы на повторную передачу, сборка, ... зачем изобретать велик?
0
|
|
|
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
|
|
| 11.10.2009, 16:35 | |
|
UDP протокол не гарантирует доставку. Все. Точка.
Если тебе нужна гарантия доставки, то используй TCP. Ну или пиши свой протокол поверх UDP - получится тот же TCP, только намного хуже по качеству
0
|
|
|
0 / 0 / 0
Регистрация: 05.10.2009
Сообщений: 27
|
||
| 11.10.2009, 17:12 [ТС] | ||
|
За дурака не принимайте только
Я знаю, что не гарантирует! Потому так вопрос и ставится... Вы видимо самого вопроса не поняли... Если так, то попробуйте еще раз прочитать ![]()
0
|
||
| 11.10.2009, 18:19 | ||
|
а я попробую снова задать тот же вопрос: а вдруг ответят? почему нельзя использовать TCP у нас в одном проекте тоже используется UDP, но мы ничего не можем поделать: другая сторона не поддерживает ничего другого. но если мы собираемся использовать средства (функции) для фрагментации большого буфера (большой в том смысл, что не влезет в один UDP пакет) так, чтобы можно было самому дописывать некоторые данные (для обеспечения гарантии доставки) к полученным фрагментам в каждый UDP пакет, значит все в наших руках, мы можем на каждой стороне делать что хотим. и при этом выбираем все же UDP. навернякак причина есть. скажи какая?
0
|
||
|
0 / 0 / 0
Регистрация: 05.10.2009
Сообщений: 27
|
|
| 11.10.2009, 19:09 [ТС] | |
|
Какая разница в чём причина?! Какое это отношение имеет к делу?
0
|
|
|
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
|
|
| 11.10.2009, 20:47 | |
|
Ну интересуется человек.
Может ты неправильный метод решения задачи выбрал ? Например может тебе лучше SCTP использовать ? (http://ru.wikipedia.org/wiki/SCTP)
0
|
|
|
0 / 0 / 0
Регистрация: 05.10.2009
Сообщений: 27
|
|
| 11.10.2009, 20:51 [ТС] | |
|
Просто поставлена школярская задача, т.е. не для практики в жизни. По существу может кто-нибудь помочь ?
0
|
|
| 12.10.2009, 00:30 | ||
|
1
|
||
|
0 / 0 / 0
Регистрация: 05.10.2009
Сообщений: 27
|
|
| 12.10.2009, 12:55 [ТС] | |
|
Не совсем понял, очередная отправленная на приемник пронумерованная "порция" данных - это (?)один(?) UDP пакет с номером части сообщения, которую он несёт?
0
|
|
| 12.10.2009, 15:52 | |||||||
0
|
|||||||
|
0 / 0 / 0
Регистрация: 05.10.2009
Сообщений: 27
|
|
| 12.10.2009, 20:48 [ТС] | |
|
Мне кажется у вас задача ставилась задача сложнее чем у меня..
Попробую спросить по-другому ![]() В общем я думаю использовать функцию sendto() и передавать по одному udp-пакету приемнику. В каждом таком пакете находится partlen байт, из которых часть байт отвечают за гарантированную доставку этого пакета, а оставшаяся часть является частью сообщения, которое мы передаём. Вопрос 1. Таким образом, получаем вопрос ![]() Дано: buffer - передаваеоме сообщение, buflen - его длина в байтах Найти: partlen - длина в байтах Вопрос 2. И кстати, будет ли быстрее, если я буду подавать не по части данных, влезающих в один пакет, а по большей части? Имеется ввиду два варианта решения: 1) buflen == максимальной длине udp пакета, который точно придёт не разбившись по пути на несколько пакетов ни на одном устройстве 2) buflen == некоторой величине, что часть сообщения не влезет в один udp пакет. В этом случай нужно иметь ввиду, что P(A)=e^k, где P(A) - вероятность, что отправленный функцией sendto буфер buf придёт(не придётся делать повторный запрос) e - вероятность, что 1 отправленный udp-пакет придёт k - количество udp-пакетов, на которое разбивает buf при отправке функцией sendto
0
|
|
|
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
|
||
| 12.10.2009, 21:47 | ||
|
0
|
||
|
0 / 0 / 0
Регистрация: 05.10.2009
Сообщений: 27
|
|
| 13.10.2009, 12:34 [ТС] | |
|
В итоге мучает меня как с самого начла когда создавал тему в основном только один вопрос: какая максимальная длина buflen udp-пакета, который точно придёт не разбившись по пути на несколько пакетов ни на одном устройстве.
просто я думаю делать так: 1) разбил сообщение на части длиной partlen=buflen-headerlen, где headerlen - длина заголовка, который я сам буду дописывать к очередной части перед её отправкой; 2) беру очередную часть, записываю её в буфер buf, дописываю в buf заголовок(обеспечивающий гарантию доставки) 3) отправляю: sendto(buf,buflen,...); Дальше возможны варианты: либо ждать пока придёт подтверждение о приходе отпраленного пакета, либо через некторый таймаут ждать от приемника номера не пришедших и последний пришедший. 4) через определённый таймаут
0
|
|
|
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
|
||
| 13.10.2009, 12:50 | ||
|
1
|
||
| 13.10.2009, 13:54 | |||
|
- "центр" шлет сообщение устройству - "центр" шлет запрос устройству, на которое ожидает ответа - устройству шлет запрос центру и ожидает ответа где были проколы - в первом варианте, т.к. там не было предусмотрено подтверждения. но с этим можно было жить тоже, поэтому ничего не меняли. в остальных случаях проблем не было. Добавлено через 2 минуты
0
|
|||
|
0 / 0 / 0
Регистрация: 05.10.2009
Сообщений: 27
|
||
| 13.10.2009, 14:26 [ТС] | ||
|
Сам определяю (пишу и клиент, и сервер). Сценарии... Не совсем понял. Просто хочу написать две функции Send и Recv. Первая гарантировано отправляет сообщение, а вторая принимает его соответствующим образом.
0
|
||
|
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
|
||
| 13.10.2009, 14:53 | ||
|
Кстати, Lowbacki надо уметь обрабатывать и такой сценарий: переданы куски 12345, на прием они пришли в порядке 13425 - ибо в сетях со сложной топологией датаграммы могут путешествовать по извилистым путям, в т.ч. с существенно разным временем доставки от передатчика к приемнику. А, например, такой сценарий: передаем 12345, прием: 1325 (кусок 2 пришел позже 3, кусок 4 потерян) ?
0
|
||
| 13.10.2009, 16:06 | |||
|
Добавлено через 3 минуты - пользовательский протокол предусматривает подтверждение каждого переданного пакета - производится сплошная нумерация пакетов. в этом случае, правда, только при получении следующего сообщения известно, было ли доставлено предыдущее. доставка последнего пакета вообще не гарантирована.
0
|
|||
|
0 / 0 / 0
Регистрация: 05.10.2009
Сообщений: 27
|
||
| 14.10.2009, 12:06 [ТС] | ||
Добавлено через 28 минут Рассмотрим ситуацию. 1) передатчик будет отправлять функцией sendto(buf, buflen,...) части своего сообщения длиной, например, buflen==1500байт. 2) По ходу доставки на приемник отправленный с передатчика один udp-пакет разобьётся например на 4 пакета Какие возможны варианты на приемнике? В том смысле, что надо ли приемнику учитывать возможное дробление пакета по пути? Или переданный пакет (те самые 1500байт) либо придёт, либо не придёт?
0
|
||
| 14.10.2009, 12:06 | |
|
Помогаю со студенческими работами здесь
20
winsock2 winsock2.h Книги по winsock2
Winsock2 в классе Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
1С: Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
|
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y
Z4Tv2zpXVVo
https:/ / github. com/ shumilovas/ med2. git
|
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа.
В качестве фильтра для отбора справочника служит группа номенклатуры.
Отбор по наименованию группы. . .
|
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
|
|
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс.
Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
|
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа.
В качестве фильтра для отбора служит значение перечислений.
/ / Событие "НачалоВыбора" реквизита на форме. . .
|
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
|
Оттенки серого
Argus19 18.03.2026
Оттенки серого
Нашёл в интернете 3 прекрасных модуля:
Модуль класса открытия диалога открытия/ сохранения файла на Win32 API;
Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
|