|
0 / 0 / 0
Регистрация: 05.10.2009
Сообщений: 27
|
|
Winsock2.h:udp фрагментирование данных11.10.2009, 12:07. Показов 5335. Ответов 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 в классе Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2.
При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
|
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут.
https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc
Первый документ красиво выглядит, но без схемы.
Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
|
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере".
Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
|
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти".
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2.
В качестве источника данных. . .
|
|
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер
Написал заготовку:
dotnet new console --aot -o UrlHandler
var items = args. Split(":");
var tag = items;
var id = items;
var executable = args;. . .
|
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3.
Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
|
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений.
9TO2GP2bpX4
a42b81fb172ffc12ca589c7898261ccb/
https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/
Слева синяя линия -. . .
|
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. .
Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
|