2012-02-22 6 views
2

Мне нужно выполнить остановку 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 был потерян.

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

+1

Похоже, этого ранее задаваемый вопрос: http://stackoverflow.com/questions/1460640/doubt-in-three-way-handshake-in-tcp-and-unix-listen-function – DRobinson

+0

Я понимаю, что SYN-ACK будет повторно, и ACK будет повторно, но как я могу проверить его с помощью select()? Мне нужно выполнить цикл recvfrom() и проверить, что это тот же SYN-ACK? –

+0

В TCP вы не имеете никакого контроля над SYN и ACK. Единственное, что вы можете сделать, это поместить сокет в неблокирующий режим, поэтому 'connect()' работает асинхронно, а затем использует функцию тайм-аута 'select()' для ожидания установления соединения. Если 'select()' истечет время ожидания, закройте сокет и запустите его. –

ответ

1

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^