Pergunta

Preciso realizar um handshake de 3 vias de parada e espera entre aplicativos cliente e servidor escritos em c ++ (com winsock 2) para uma atribuição. O cliente envia um SYN. O servidor incrementa o número de sequência do cliente e envia um SYN-ACK. O cliente incrementa o número de sequência do servidor e envia um ACK.

Para simular a perda de pacotes, o cliente e o servidor são conectados a um programa roteador intermediário que ocasionalmente não encaminha pacotes, causando perda. Como devo estruturar minhas declarações sendto (), select (), recvfrom () para contabilizar a possível perda de pacotes?

Por exemplo, se o SYN for perdido e o cliente expirar, reenvie-o. Se o SYN-ACK for perdido, o cliente expira e reenvia o SYN. Não tenho ideia do que fazer se o ACK for perdido.

Editar: basicamente funciona assim no meu cliente:

  • Envie SYN.
  • Loop enquanto a instrução select () falha e reenviar SYN
  • Receba SYN-ACK
  • Enviar ACK
  • Loop para possivelmente receber novamente SYN-ACK se ACK foi perdido.

Como sei quando parar o loop?

Foi útil?

Solução

select pode ser usado para verificar quando um soquete pode ser lido sem bloqueio.

Para verificar a qual pacote enviado o ACK pertence, você verifica o número de sequência.

Se você não receber um ACK dentro do tempo limite, basta reenviar o último pacote.Não importa o tipo de pacote enviado, se você não receber um ACK, deve reenviá-lo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top