|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
07.05.2012, 15:01 | #1 |
Регистрация: 16.04.2010
Сообщений: 6
|
Частота отправки данных в UDP
Всем привет!
Написал приложение (клиент-сервер (C++/Linux(Ubuntu))), использую для асинхронности epoll и неблокирующие сокеты. Аналогичное приложение на Windows, только там WinSock2 и IOCP для асинхронности. В общем никогда не думал, что столкнусь с таким багом: мне сообщений приходит или больше, или меньше, чем я их отослал. Теперь подробнее: есть модуль, который разбивает большие объемы данных на более мелкие (по 1000 байт) и отсылает их в цикле (сервер), этот же модуль (на клиенте) склеивает данные и предоставляет пользователю готовое сообщение (например при отсылке картинки). Модуль работает нормально, тестировал без сетевой части. Как только начал передавать данные по сети - появились баги. Долго не мог понять в чем дело, потом написал тест для сокетов: 2 UDP сокета в цикле отсылают данные друг-другу, а при обработке принятия данных на конкретный сокет - сделал ранее 2 переменные (int), обнулил их и делаю инкремент определенной переменной. Например: отсылаю 1000 раз на каждый сокет по 1024 байта. Тест провален. В результате переменные не равны 1000, а они меньше (в epoll) и больше (в IOCP) этого значения. При чем: если поставить после каждой отсылки delay или cout/printf - все работает без сбоев! В связи с этим вопрос: где может быть баг и какая максимальная частота отправки сообщений для UDP? Спасибо! |
07.05.2012, 15:46 | #2 |
добрый няша
Старожил
Регистрация: 29.10.2006
Сообщений: 4,804
|
всё упирается в то что два пакета отправленные по UDP не обязательно придут в том порядке в которым ты их отправил. покеты могут задерживаться на неопределённый промежуток в совершенно необжиданных местах сети. поэтому при разбиении больших порций надо нумеровать части и после их отправки ждать сообщения от клиента, все ли он части получил, а если не все получил то какие именно он не получил
|
07.05.2012, 16:07 | #3 |
Регистрация: 16.04.2010
Сообщений: 6
|
Есть слой, в протоколе, который отвечает за правильную посылку/прием данных (в правильном порядке), есть слой, который отвечает за отчет о доставке сообщения. Эти слои работают нормально. В общем проблема только в том, что если беспорядочно слать данные, то прием данных воспринимает операцию как незавершенную... Если ставить delay - все работает без проблем. Как-то же работает торрент? Тут принцип один и тот же.
Тест я написал не используя протокол. Просто отсылаю random сообщение n-раз. Есть переменная counter, изначально нулевая. Теперь я n раз отсылаю сообщение, а при приеме данных counter++. В идеале должен работать, но нет... |
07.05.2012, 16:40 | #4 |
Старожил
Регистрация: 29.09.2009
Сообщений: 9,713
|
...у торрента протокол есть. Формируйте у себя пакет данных и контролируйте на приемной стороне правильность доставки.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation |
07.05.2012, 17:44 | #5 | |
добрый няша
Старожил
Регистрация: 29.10.2006
Сообщений: 4,804
|
торрент работает по протоколу TCP
Цитата:
почему приходят лишние - непонятно, и врядли вам кто-то поможет разобраться в этом. |
|
07.05.2012, 19:00 | #6 | ||
Регистрация: 16.04.2010
Сообщений: 6
|
Цитата:
TCP используется для соединения с трекером. Цитата:
Есть идея такая: при отсылке данных не отсылать их сразу, а ставить в очередь, а отсылать только тогда, когда приходит отчет о доставке предыдущего сообщения. Должно заработать... В теории) |
||
08.05.2012, 01:42 | #7 |
Старожил
Регистрация: 03.01.2011
Сообщений: 2,508
|
> как вообще могут теряться данные на localhost-е?
входной буфер для юдп сокета не такой уж и большой (по-умолчанию около 65КБ, если не ошибаюсь), если вовремя не выгребать из него данные, пакеты будут потеряны. Иначе получаем удобное хранилище данных: отослал пару сотен гиг локалхосту по юдп, а через неделю пришёл и забрал, что надо. > Есть идея такая примерно так и работает тсп, может, проще сразу на него перейти, если так уж важна правильная доставка?
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
|
08.05.2012, 09:03 | #8 | |
добрый няша
Старожил
Регистрация: 29.10.2006
Сообщений: 4,804
|
Цитата:
UDP используется в DHT, а DHT это совершенно другой протокол и его роль всего лишь вспомогательная. |
|
08.05.2012, 10:14 | #9 |
Старожил
Регистрация: 03.01.2011
Сообщений: 2,508
|
сейчас глянул вайрщарком, что шлёт торрент (µTorrent). Именно при скачке идут исключительно юдп пакеты. Примерно на каждые 2 принятых пакета с 1438 байтами полезной нагрузки уходит один пакет (подтверждения?) с 20 байтами данных. Скорей всего, он начинает слать с какой-то начальной скоростью (10-50 КБ/с) и пробует повышать скорость передачи, пока число неподтверждённых пакетов не привысит некий порог. При современных скоростных сетях это достаточно разумно.
Походу, в µTorrent такой протокол появился первым, и название у него есть — мтп. Вайрщарк его декодирует (с небольшими ошибками) как BT-uTP.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
Последний раз редактировалось veniside; 08.05.2012 в 10:44. |
11.05.2012, 11:18 | #10 |
Регистрация: 16.04.2010
Сообщений: 6
|
veniside, тебе респект! Реально очень полезная инфа. Значит идея теперь такая: при отправке ставить все пакеты в очередь, другой поток отсылает какое-то кол-во этих пакетов с какой-то "плавающей" частотой, которую буду высчитывать, по разнице времени отправки и времени отчета о доставке. Как-то так)))
Еще раз спасибо! |
|
Опции темы | Поиск в этой теме |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Подскажите пожалуйста скрипт для отправки данных на е-майл | STANDING | HTML и CSS | 6 | 28.11.2015 11:03 |
Проблема с приёмом данных через UDP | Shouldercannon | Общие вопросы Delphi | 0 | 21.05.2011 21:02 |
UDP отправка данных | saggy | Компоненты Delphi | 4 | 12.07.2010 12:54 |
разъясните терминалогию,референсная частота,частота чипа,памяти,шейдерного блока | Jesus2.0 | Компьютерное железо | 5 | 04.05.2009 07:54 |
форма отправки данных с функцией прикрепления файлов | zetrix | PHP | 0 | 29.10.2006 20:24 |