Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Delphi: Сети > TClientSocket и 16 мс |
Автор: kanmailru 22.11.2011, 11:40 | ||
Здравствуйте Уважаемые Эксперты! Прошу, помогите, разобраться. Имеется TClientSocket созданное как:
Данные отправляются мне от сервера каждую миллисекунду (вижу в снифере), однако в логе я вижу, что мне пришло 16 сообщений каждые 16 мс. Алгоритм Нагла на сервере и у меня выключен. Побывал читать буфер каждую миллисекунду, используя NtDelayExecution из ntdll.dll, получаю тоже самое. Может быть кто-то сталкивался, как боролись? ![]() |
Автор: Alexeis 22.11.2011, 14:39 | ||
kanmailru, попробуйте отключить входной буфер. функцией setsockopt
Добавлено через 2 минуты и 19 секунд Вообще TCP/IP это потоковый протокол. Для быстрого отклика нужно использовать UDP. |
Автор: kanmailru 22.11.2011, 16:47 | ||
Если брать val := 0; то данные вообще не принимаются, причём сервер говорит, что приёмник не готов. Пытался поиграть с разными размерами буферов, получается, что данные реально приходят указанными пакетами. Однако данные как и раньше приходят каждые 16 мс (видимо в начале кванта времени выделенного потоку). NtDelayExecution к сожалению, как и sleep не даёт задержки кратные 16 мс. Использую Windows 7. Delphi XE. Применение TCP протокола обязательное условие, так сделан сторонний сервер.
Привожу часть характерного лога (буфер 128 байт): из него видно, что данные как бы приходят раз в 15-16 мс. Приёмщик данных реализован как TFixManager = class(TThread) с обычным приоритетом. |
Автор: kanmailru 22.11.2011, 17:37 |
Да, как говорили в одном известном фильме : "Трудно найти черную кошку в тёмной комнате, особенно если её там нет...", проблема была в другом. Я измерил время с помощью GetCurrentTime , однако значение данной функции изменяется раз в те самые пресловутые 16 мс. Если измерить с помощью банального now и посмотреть в миллисекунды, то видно что таймер тикает. Так, что задача снимается. ![]() |