Это довольно общий вопрос о сокетах TCP. У меня есть настройка клиент-серверного приложения, в которой сообщения отправляются по сети через TCP. Реализация осуществляется через C++ POCO, однако вопрос не связан с конкретной технологией.
Сообщение может быть запросом (инициированным клиентом) или ответом (инициированным сервером).
Запрос имеет структуру:
Message Header
Request Header
Parameters
Ответ имеет структуру
Message Header
Response Header
Parameters
Я знаю, что TCP гарантирует, что отправленные пакеты будут доставлены в том порядке, в котором они были отправлены. Тем не менее, ничего нельзя предположить о промежутке времени, который может потребоваться для доставки.
С обеих сторон у меня настроен тайм-аут чтения/отправки. Теперь интересно, как иметь чистую настройку на передаваемых данных после тайм-аута. Не знаю, как выразить это в правильных терминах, поэтому позвольте мне описать пример:
- Сервер S отправляет ответ клиенту (заголовок сообщения, заголовок ответа, параметры помещаются в поток)
- Клиент C частично получает заголовок сообщения (например, первые 4 байта из 12).
- После того, как эти 4 байта были получены, происходит тайм-аут приема
- На стороне клиента будет выброшено соответствующее исключение, прием будет остановлен.
- Клиент считает пакет недействительным.
Теперь проблема в том, что когда клиент пытается получить другой пакет, он может получить оставшуюся часть «старого» заголовка ответного сообщения. С точки зрения текущей обрабатываемой транзакции (отправить запрос/получить ответ) клиент получает мусор.
Таким образом, кажется, что после тайм-аута (независимо от того, был ли он на стороне клиента или на стороне сервера) связь должна продолжаться с «чистой настройкой», что означает, что ни один из партнеров по связи не будет пытаться отправить какие-то старые данные пакета и что в буфере потока соответствующего сокета не хранятся данные старого пакета.
Так как же обычно обрабатываются такие ситуации? Есть ли какой-то шаблон дизайна/идиоматический способ решить эту проблему? Как такие ситуации обрабатываются в других протоколах на основе TCP, например. HTTP?
Во всех образцах TCP в сети я никогда не видел реализации, которая решает такие проблемы...
заранее спасибо