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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.05.2012, 15:01   #1
alexlogvinenkoit
 
Регистрация: 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?

Спасибо!
alexlogvinenkoit вне форума Ответить с цитированием
Старый 07.05.2012, 15:46   #2
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

всё упирается в то что два пакета отправленные по UDP не обязательно придут в том порядке в которым ты их отправил. покеты могут задерживаться на неопределённый промежуток в совершенно необжиданных местах сети. поэтому при разбиении больших порций надо нумеровать части и после их отправки ждать сообщения от клиента, все ли он части получил, а если не все получил то какие именно он не получил
rpy3uH вне форума Ответить с цитированием
Старый 07.05.2012, 16:07   #3
alexlogvinenkoit
 
Регистрация: 16.04.2010
Сообщений: 6
По умолчанию

Есть слой, в протоколе, который отвечает за правильную посылку/прием данных (в правильном порядке), есть слой, который отвечает за отчет о доставке сообщения. Эти слои работают нормально. В общем проблема только в том, что если беспорядочно слать данные, то прием данных воспринимает операцию как незавершенную... Если ставить delay - все работает без проблем. Как-то же работает торрент? Тут принцип один и тот же.

Тест я написал не используя протокол. Просто отсылаю random сообщение n-раз. Есть переменная counter, изначально нулевая. Теперь я n раз отсылаю сообщение, а при приеме данных counter++. В идеале должен работать, но нет...
alexlogvinenkoit вне форума Ответить с цитированием
Старый 07.05.2012, 16:40   #4
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,742
По умолчанию

...у торрента протокол есть. Формируйте у себя пакет данных и контролируйте на приемной стороне правильность доставки.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 07.05.2012, 17:44   #5
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

Цитата:
Сообщение от alexlogvinenkoit Посмотреть сообщение
Как-то же работает торрент? Тут принцип один и тот же.
торрент работает по протоколу TCP

Цитата:
Сообщение от alexlogvinenkoit Посмотреть сообщение
Тест я написал не используя протокол. Просто отсылаю random сообщение n-раз. Есть переменная counter, изначально нулевая. Теперь я n раз отсылаю сообщение, а при приеме данных counter++. В идеале должен работать, но нет...
если количество принятых пакетов меньше количество отосланных то это просто потери и отправке.

почему приходят лишние - непонятно, и врядли вам кто-то поможет разобраться в этом.
rpy3uH вне форума Ответить с цитированием
Старый 07.05.2012, 19:00   #6
alexlogvinenkoit
 
Регистрация: 16.04.2010
Сообщений: 6
По умолчанию

Цитата:
торрент работает по протоколу TCP
http://ru.wikipedia.org/wiki/BitTorr...80.D1.82.D1.8B
TCP используется для соединения с трекером.

Цитата:
если количество принятых пакетов меньше количество отосланных то это просто потери и отправке.
Ну и как вообще могут теряться данные на localhost-е? Я понимаю на разных машинах, тогда согласился бы, а так потерь вообще быть не должно.

Есть идея такая: при отсылке данных не отсылать их сразу, а ставить в очередь, а отсылать только тогда, когда приходит отчет о доставке предыдущего сообщения. Должно заработать... В теории)
alexlogvinenkoit вне форума Ответить с цитированием
Старый 08.05.2012, 01:42   #7
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> как вообще могут теряться данные на localhost-е?

входной буфер для юдп сокета не такой уж и большой (по-умолчанию около 65КБ, если не ошибаюсь), если вовремя не выгребать из него данные, пакеты будут потеряны. Иначе получаем удобное хранилище данных: отослал пару сотен гиг локалхосту по юдп, а через неделю пришёл и забрал, что надо.

> Есть идея такая

примерно так и работает тсп, может, проще сразу на него перейти, если так уж важна правильная доставка?
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 08.05.2012, 09:03   #8
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

Цитата:
Сообщение от alexlogvinenkoit Посмотреть сообщение
http://ru.wikipedia.org/wiki/BitTorr...80.D1.82.D1.8B
TCP используется для соединения с трекером.
конкретно при передаче файлов используется протокол TCP

UDP используется в DHT, а DHT это совершенно другой протокол и его роль всего лишь вспомогательная.
rpy3uH вне форума Ответить с цитированием
Старый 08.05.2012, 10:14   #9
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

сейчас глянул вайрщарком, что шлёт торрент (µTorrent). Именно при скачке идут исключительно юдп пакеты. Примерно на каждые 2 принятых пакета с 1438 байтами полезной нагрузки уходит один пакет (подтверждения?) с 20 байтами данных. Скорей всего, он начинает слать с какой-то начальной скоростью (10-50 КБ/с) и пробует повышать скорость передачи, пока число неподтверждённых пакетов не привысит некий порог. При современных скоростных сетях это достаточно разумно.

Походу, в µTorrent такой протокол появился первым, и название у него есть — мтп. Вайрщарк его декодирует (с небольшими ошибками) как BT-uTP.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."

Последний раз редактировалось veniside; 08.05.2012 в 10:44.
veniside вне форума Ответить с цитированием
Старый 11.05.2012, 11:18   #10
alexlogvinenkoit
 
Регистрация: 16.04.2010
Сообщений: 6
По умолчанию

veniside, тебе респект! Реально очень полезная инфа. Значит идея теперь такая: при отправке ставить все пакеты в очередь, другой поток отсылает какое-то кол-во этих пакетов с какой-то "плавающей" частотой, которую буду высчитывать, по разнице времени отправки и времени отчета о доставке. Как-то так)))
Еще раз спасибо!
alexlogvinenkoit вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подскажите пожалуйста скрипт для отправки данных на е-майл 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