Вопрос

Мне нужно выполнить трехстороннюю остановку и дождаться рукопожатия между клиентскими и серверными приложениями, написанными на C ++ (с winsock 2) для назначения. Клиент отправляет SYN. Сервер увеличивает порядковый номер клиента и отправляет SYN-ACK. Клиент увеличивает порядковый номер сервера и отправляет ACK.

Для имитации потери пакетов клиент и сервер подключаются к программе-посреднику-маршрутизатору, которая иногда не пересылает пакеты, что приводит к потере. Как мне структурировать свои операторы sendto (), select (), recvfrom () для учета возможной потери пакетов?

Например, если SYN потерян и время ожидания клиента истекло, отправьте его повторно. Если SYN-ACK потерян, время ожидания клиента истекает и повторно отправляется SYN. Я не знаю, что делать, если ACK потерян.

Изменить: в основном это происходит на моем клиенте:

  • Отправить SYN.
  • Выполнить цикл при ошибке оператора select () и повторно отправить SYN
  • Получить SYN-ACK
  • Отправить ACK
  • Цикл для возможного повторного получения SYN-ACK, если ACK был потерян.

Как узнать, когда прекратить цикл?

Это было полезно?

Решение

select можно использовать для проверки, когда сокет может быть прочитан без блокировки.

Что касается проверки, который отправил пакет, ACK принадлежит, вы проверяете порядковый номер.

Если вы не получили ACK в Timeout, вы просто повторно отправьте последний пакет.Неважно, какой пакет вы отправили, если вы не получите ACK, вы должны повторно его отправить.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top