Добрый день.
Возник следующий вопрос.
Пишу приложение на C++ с сокетами. У меня следующая проблема:
создаю отдельный поток который получает пакеты с сокета (recvfrom()) и сразу же делаю вызов GetSystemTime(&sTime). Т.е. у меня в sTime время выборки нового пакета из очереди пакетов на соккете. Проблема в том что в этом же потоке я обрабатываю данный пакет и это может занять некоторое время, что накопиться очередь из входящих пакетов, а время прихода пакета для меня очень важно. Можно ли и как брать время пакета, именно время поступления его на сетевую карту а не время извлекания его из очереди пакетов. Существует ли данные записи в ОС.
Использую Win XP.
Или лучше сделать еще поток на обработку пакетов? Чтобы 1-н поток только принимал пакеты и записывал их время, записывал в очередь которую обрадбатывает другой поток?
23.03.07 15:16: Перенесено модератором из 'C/C++' — Кодт
Здравствуйте, HighVoltage, Вы писали:
HV>Или лучше сделать еще поток на обработку пакетов? Чтобы 1-н поток только принимал пакеты и записывал их время, записывал в очередь которую обрадбатывает другой поток?
конечно же обработка должна быть в другом thread'e!
принимающий thread всего лишь пробивает время и ставит пакет в очередь на обработку, и если эта очередь переполняеца (!) начинает "сливать" пакеты (не давая задосить сервер)...
многое конечно зависит от того что это за сервер... должен ли он слать ответы на запросы или просто их регистрирует? какова ценность пакетов? можно ли их выбрасывать?
Re[2]: Время поступления пакета на соккет.
От:
Аноним
Дата:
23.03.07 11:43
Оценка:
Здравствуйте, zaufi, Вы писали:
Z>конечно же обработка должна быть в другом thread'e! Z>принимающий thread всего лишь пробивает время и ставит пакет в очередь на обработку, и если эта очередь переполняеца (!) начинает "сливать" пакеты (не давая задосить сервер)... Z>многое конечно зависит от того что это за сервер... должен ли он слать ответы на запросы или просто их регистрирует? какова ценность пакетов? можно ли их выбрасывать?
Спасибо!
Ответы на запросы слать не должен. Выбрасывать — да можно. С данными внутри пакета ничего не делается. Их надо просто передать дальше. А обрабатывается как раз время появления пакета.
Здравствуйте, HighVoltage, Вы писали:
HV>Можно ли и как брать время пакета, именно время поступления его на сетевую карту а не время извлекания его из очереди пакетов. Существует ли данные записи в ОС.
Да, существуют, но увы, на уровне ядра. Сколько времени пройдет между получением драйвером пакета и возвратом из recvfrom — это неопределено. Ты правильно определил главный фактор, который на это время влияет. Сделай так чтобы один поток у тебя всегда висел в recvfrom, чтобы задержка передачи пакетов твоему приложению была как можно меньше.
Здравствуйте, Michael Chelnokov, Вы писали:
MC>Здравствуйте, HighVoltage, Вы писали:
HV>>Можно ли и как брать время пакета, именно время поступления его на сетевую карту а не время извлекания его из очереди пакетов. Существует ли данные записи в ОС.
MC>Да, существуют, но увы, на уровне ядра. Сколько времени пройдет между получением драйвером пакета и возвратом из recvfrom — это неопределено. Ты правильно определил главный фактор, который на это время влияет. Сделай так чтобы один поток у тебя всегда висел в recvfrom, чтобы задержка передачи пакетов твоему приложению была как можно меньше.
Спасибо. Значит вариант только 1-н. Буду его пользовать.
Все это хорошо, но если Вам нужны точности в районе 10мс( и меньше ) врядли что то надежное получиться. А если требования к точности ниже, непонятно, что за обработка пакета длится так долго?