Привет всем! Поднимаю проект годовой давности, который пришлось заморозить из за странных глюков. Попытаюсь описать все как можно подробнее.
Есть две машины под управлением Windows связаны гигабитной сетью Ethernet. Программа на C# синхронно пишет и читает аудио трафик с переодичностью 8мс. Сниффер показывает, что все пакеты доставляются через сеть вовремя. Размер пакета ~512байт, время пересылки меньше 1мс. Тест встроенный в саму программу показывает задержки с неравным периодом примерно на 10-20мс, а иногда даже 200мс. После чего пакеты приходят все вместе (неактуальные программа отбрасывает). Локальный трафик (loopback) при этом проигрывается без задержек, что может свидетельствовать о то, что сам процесс не тормозит. Пробовали протоколы UDP и RTP. Результат идентичен.
Резюмируя можно сказать, что сам процесс не тормозит, трафик доставляется на машину вовремя, а вот в программу поступает с непонятными задержками. При этом звук искажается через каждые ~30 секунд. Искажение длится тоже ~30 секунд (становится как-бы электронным), а затем опять становится нормальным. Что бы это могло быть?
Здравствуйте, metacoder, Вы писали:
M>Привет всем! Поднимаю проект годовой давности, который пришлось заморозить из за странных глюков. Попытаюсь описать все как можно подробнее.
M>Есть две машины под управлением Windows связаны гигабитной сетью Ethernet. Программа на C# синхронно пишет и читает аудио трафик с переодичностью 8мс. Сниффер показывает, что все пакеты доставляются через сеть вовремя. Размер пакета ~512байт, время пересылки меньше 1мс. Тест встроенный в саму программу показывает задержки с неравным периодом примерно на 10-20мс, а иногда даже 200мс. После чего пакеты приходят все вместе (неактуальные программа отбрасывает). Локальный трафик (loopback) при этом проигрывается без задержек, что может свидетельствовать о то, что сам процесс не тормозит. Пробовали протоколы UDP и RTP. Результат идентичен.
RTP обычно бегает поверх UDP (я не учитываю неживой на винде SCTP и отчаянные попытки спасти неизвестно что передачей RTP по TCP), так что его можно было не вспоминать.
Локальный трафик сразу доставляется в сокет получателя с пинком соответствующей задачи, поэтому это тоже ничего не значит, хотя может служить намёком на то, что проблема связана с внешней сетью. А вот тут начинаются интересности. Если сниффер всё показывает вовремя, то проблема по пути от сетевого драйвера до IP стека и далее до сокета получателя. Может, какой антивирус вмешивается или сверхумный файрволл с анализом трафика?
M>Резюмируя можно сказать, что сам процесс не тормозит, трафик доставляется на машину вовремя, а вот в программу поступает с непонятными задержками. При этом звук искажается через каждые ~30 секунд. Искажение длится тоже ~30 секунд (становится как-бы электронным), а затем опять становится нормальным. Что бы это могло быть?
Здравствуйте, netch80, Вы писали:
N>RTP обычно бегает поверх UDP (я не учитываю неживой на винде SCTP и отчаянные попытки спасти неизвестно что передачей RTP по TCP), так что его можно было не вспоминать.
N>Локальный трафик сразу доставляется в сокет получателя с пинком соответствующей задачи, поэтому это тоже ничего не значит, хотя может служить намёком на то, что проблема связана с внешней сетью. А вот тут начинаются интересности. Если сниффер всё показывает вовремя, то проблема по пути от сетевого драйвера до IP стека и далее до сокета получателя. Может, какой антивирус вмешивается или сверхумный файрволл с анализом трафика?
И правда есть и антивирусы и файервол есть. Спасибо большое, попробую без них.
Здравствуйте, netch80, Вы писали:
N>RTP обычно бегает поверх UDP (я не учитываю неживой на винде SCTP и отчаянные попытки спасти неизвестно что передачей RTP по TCP), так что его можно было не вспоминать.
N>Локальный трафик сразу доставляется в сокет получателя с пинком соответствующей задачи, поэтому это тоже ничего не значит, хотя может служить намёком на то, что проблема связана с внешней сетью. А вот тут начинаются интересности. Если сниффер всё показывает вовремя, то проблема по пути от сетевого драйвера до IP стека и далее до сокета получателя. Может, какой антивирус вмешивается или сверхумный файрволл с анализом трафика?
Правда были и антивирусы и файэрволы. Буду пробовать без них, спасибо большое!
Здравствуйте, metacoder, Вы писали:
M>Привет всем! Поднимаю проект годовой давности, который пришлось заморозить из за странных глюков. Попытаюсь описать все как можно подробнее.
M>Есть две машины под управлением Windows связаны гигабитной сетью Ethernet. Программа на C# синхронно пишет и читает аудио трафик с переодичностью 8мс. Сниффер показывает, что все пакеты доставляются через сеть вовремя. Размер пакета ~512байт, время пересылки меньше 1мс. Тест встроенный в саму программу показывает задержки с неравным периодом примерно на 10-20мс, а иногда даже 200мс. После чего пакеты приходят все вместе (неактуальные программа отбрасывает). Локальный трафик (loopback) при этом проигрывается без задержек, что может свидетельствовать о то, что сам процесс не тормозит. Пробовали протоколы UDP и RTP. Результат идентичен.
M>Резюмируя можно сказать, что сам процесс не тормозит, трафик доставляется на машину вовремя, а вот в программу поступает с непонятными задержками. При этом звук искажается через каждые ~30 секунд. Искажение длится тоже ~30 секунд (становится как-бы электронным), а затем опять становится нормальным. Что бы это могло быть?
Возможно стоит посмотреть на проблему с другой стороны.
Проблема может быть из за неточности функций работы со временем. 10-20мс вполне может быть погрешностью timeGetTime().
Сталкивался с такой проблемой при разработке игр, там погрешность в 20мс часто нежелательна. Решалось с помощью использования ф-ций для точного измерения времени(напр. QueryPerformanceCounter()), сглаживанием полученных значений времени / повышением приоритета приложения.
M>Резюмируя можно сказать, что сам процесс не тормозит, трафик доставляется на машину вовремя, а вот в программу поступает с непонятными задержками. При этом звук искажается через каждые ~30 секунд. Искажение длится тоже ~30 секунд (становится как-бы электронным), а затем опять становится нормальным. Что бы это могло быть?
а что, нельзя добавить в программу буферизацию входящих данных хотябы на секунду, чтобы меньше зависеть от задержек?
Как много веселых ребят, и все делают велосипед...