Мне нужно выполнить остановку 3way и ждать рукопожатия между клиентскими и серверными приложениями, написанными на C++ (с помощью winsock 2) для назначения. Клиент отправляет SYN. Сервер увеличивает порядковый номер клиента и отправляет SYN-ACK. Клиент увеличивает порядковый номер сервера и отправляет ACK.Потеря пакетов во время установления связи 3way
Чтобы имитировать потерю пакетов, клиент и сервер подключены к промежуточной программе маршрутизатора, которая иногда не передает пакеты, что приводит к потере. Как я должен структурировать свои инструкции sendto(), select(), recvfrom() для учета возможной потери пакетов?
Например, если SYN потерян и клиент не работает, отправьте его повторно. Если SYN-ACK потерян, клиент отключается и повторно отправляет SYN. Я не знаю, что делать, если ACK потерян.
Edit: Это в основном идет как это на моем клиенте:
- Отправить SYN.
- Loop во время выбора() оператор не может и повторно SYN
- Прием SYN-ACK
- Отправить ACK
- Loop, чтобы, возможно, повторно получить SYN-ACK, если ACK был потерян.
Как узнать, когда прекратить цикл?
Похоже, этого ранее задаваемый вопрос: http://stackoverflow.com/questions/1460640/doubt-in-three-way-handshake-in-tcp-and-unix-listen-function – DRobinson
Я понимаю, что SYN-ACK будет повторно, и ACK будет повторно, но как я могу проверить его с помощью select()? Мне нужно выполнить цикл recvfrom() и проверить, что это тот же SYN-ACK? –
В TCP вы не имеете никакого контроля над SYN и ACK. Единственное, что вы можете сделать, это поместить сокет в неблокирующий режим, поэтому 'connect()' работает асинхронно, а затем использует функцию тайм-аута 'select()' для ожидания установления соединения. Если 'select()' истечет время ожидания, закройте сокет и запустите его. –