2014-09-16 6 views
0

У нас есть клиент UDP, который обменивается данными с сервером.Ответ UDP, полученный после таймаута

Сервер дает один ответ на каждый запрос.

Клиент отправляет запрос и ждет ответа 5 секунд.

Если ответ сервера не был получен на 5 секунд - клиент предполагает, что пакет был потерян в сети (это UDP ...), записывает отчет в журнал и отправляет следующий запрос.

Но иногда у нас есть задержка в сети, и ответ сервера приходит через 5 секунд.

Опишем сценарий:

Клиент посылает пакет под названием «X».

Время ожидания 5 секунд истекло, и клиент сообщает, что «X» является потерянным пакетом.

Клиент отправил другой пакет с именем «Y».

Ответ сервера на «X» теперь предоставляется клиенту.

Клиент видит, что ответ несовместим с запросом и сообщает об этом журналу.

Клиент отправил другой пакет с именем «Z».

Ответ сервера на «Y» теперь предоставляется клиенту.

Клиент видит, что ответ несовместим с запросом и сообщает об этом журналу.

И это бесконечная петля!

Что мы можем сделать?

+0

Вы говорите, что клиент перестает ждать реального ответа (так что он не ждет полных 5 секунд), если он получает ответ, который не соответствует самому последнему запросу? – nos

+0

редко обработка занимает 6 секунд или более (я не могу ее идентифицировать). –

+0

Хорошо, но как насчет вопроса, который я задал? Ваш клиент отправляет новый запрос сразу после получения неожиданного ответа? – nos

ответ

0

Многие протоколы на основе UDP содержат идентификатор, указывающий, к какому запросу принадлежит данный ответ. Клиент выбирает идентификатор и отправляет его на сервер как часть запроса, а затем сервер отсылает его обратно в ответ. Это позволяет клиенту сопоставлять ответы на запросы, особенно в ситуациях, подобных описанию. Если клиент получил ответ на X после его перемещения, он сможет просто проигнорировать этот ответ.

+0

Спасибо. Я попробую. –

+0

Да - порядковые номера AKA ':) –