Как предотвратить поздние ответы на сокет TCP? - PullRequest
5 голосов
/ 22 октября 2011

Я пишу библиотеку базы данных, которая должна разумно поддерживать тайм-ауты.Теперь, когда я смотрю на пул соединений, меня особенно беспокоит следующий сценарий:

  1. Отправить запрос # 1
  2. Тайм-аут после n секунд.
  3. Отправить запрос # 2
  4. Получить ответ на запрос # 1

Шаг четвертый может произойти, поскольку запросы не помечены идентификатором запроса: всеЯ знаю, что получил ответ, и я не знаю, к какому запросу он относится.Можно утверждать, что это является ошибкой в ​​протоколе, но это не мое дело.

Перед отправкой запроса № 2, что мне следует сделать с сокетом, чтобы избежать такого позднего ответа?Единственный правильный путь к shutdown(), close() и повторному connect()?

1 Ответ

3 голосов
/ 22 октября 2011

Я боюсь, что это единственный безопасный способ управлять вашим соединением, потому что нет другого способа получить один-к-одному между вопросом и ответом по TCP. Кажется, что между ними отсутствует какая-то функция cancel .

Эта ссылка дает более глубокое понимание: http://www.ssfnet.org/Exchange/tcp/tcpTutorialNotes.html

...