Qual é a melhor maneira de implementar uma pulsação em C ++ para verificar se há conectividade de soquete?

StackOverflow https://stackoverflow.com/questions/495922

  •  20-08-2019
  •  | 
  •  

Pergunta

Hey gangue. Acabo de escrever um cliente e servidor em C ++ usando sys / soquete. Eu preciso para lidar com uma situação em que o cliente ainda está ativa, mas o servidor está para baixo. Uma maneira sugerida para fazer isso é usar um piscar de olhos para conectividade periodicamente assert. E se não há ninguém para tentar se reconectar a cada X segundos para período Y de tempo, e depois de um tempo.

É este o "batimento cardíaco" a melhor maneira de verificar a conectividade?

A tomada Eu estou usando pode ter informações sobre ele, há uma maneira para verificar se há uma conexão sem mexer com o buffer?

Foi útil?

Solução

Se você estiver usando sockets TCP em uma rede IP, você pode usar o recurso de keepalive do protocolo TCP, que irá verificar periodicamente o soquete para certificar-se do outro lado ainda está lá. (Isto também tem a vantagem de manter o registro de encaminhamento para o seu soquete válida em qualquer roteador NAT entre seu cliente e seu servidor.)

Aqui está um TCP keepalive visão geral que descreve algumas das razões que você pode querer usar TCP keepalive; este COMO FAZER específica do Linux descreve como configurar seu soquete para usar TCP keepalive em tempo de execução.

Parece que você pode ativar keepalive TCP no Windows sockets, definindo SIO_KEEPALIVE_VALS usando o WSAIoctl () função.

Se você estiver usando UDP soquetes sobre IP que você precisa para construir o seu próprio batimento cardíaco em seu protocolo.

Outras dicas

Sim, esta pulsação é o melhor caminho. Você vai ter que construí-lo no protocolo o servidor eo cliente uso para se comunicar.

A solução mais simples é ter os dados dos clientes enviam periodicamente e o servidor fechar a conexão se não recebeu quaisquer dados do cliente em um determinado período de tempo. Isso funciona perfeitamente para protocolos de consulta / resposta em que o cliente envia consultas e o servidor envia respostas.

Por exemplo, você pode usar o seguinte esquema:

  1. Os responde servidor para cada consulta. Se o servidor não recebe uma consulta por dois minutos, ele fecha a conexão.

  2. O cliente envia consultas e mantém a abrir conexão depois de cada um.

  3. Se o cliente não enviar uma consulta por um minuto, ele envia uma "você está aí" consulta. O servidor responde com "sim eu sou". Isso redefine do servidor dois minutos temporizador e confirma ao cliente que a conexão ainda está disponível.

Pode ser mais simples apenas para ter o cliente fechar a conexão se não tem a necessidade de enviar uma consulta para o passado minuto. Uma vez que todas as operações são iniciadas pelo cliente, ele pode simplesmente abrir uma nova conexão se ele precisa realizar uma nova operação. Isso reduz a apenas isso:

  1. O servidor fecha a conexão se não recebeu uma consulta em dois minutos.

  2. O cliente fecha a conexão se não tem a necessidade de enviar uma consulta em um minuto.

No entanto, isso não garante ao cliente que o servidor está presente e pronto para aceitar uma consulta em todos os momentos. Se você precisar desse recurso, você terá que implementar um "você está aí" "sim, eu sou" consulta / resposta em seu protocolo.

Se o outro lado foi embora (ou seja, o processo tenha morrido, a máquina tem ido para baixo, etc.), na tentativa de receber dados do soquete deve resultar em um erro. No entanto, se o outro lado é apenas hung, o soquete permanecerá aberta. Neste caso, tendo um batimento cardíaco é útil. Certifique-se de que tudo o protocolo que você está usando (no topo do TCP) oferece suporte a algum tipo de "não fazer nada" pedido ou pacote - cada lado pode usar isso para manter o controle da última vez que recebeu algo do outro lado, e pode, então, fechar a conexão se demasiado decorre de tempo entre pacotes.

Note que este está supondo que você está usando TCP / IP. Se você estiver usando UDP, então isso é toda uma outra chaleira de peixes, desde a sua conexão.

Ok, eu não sei o que seu programa faz ou qualquer coisa, então talvez isso não é viável, mas eu sugiro que você evite tentando manter sempre o soquete aberto. Ele só deve ser aberto quando você estiver usando ele, e deve ser fechado quando você não está.

Se você está entre leituras e gravações de espera na entrada do usuário, perto da tomada. Projetar seu / protocolo cliente-servidor (supondo que você está fazendo isso com a mão e não utilizando quaisquer protocolos normalizados como http e / ou SOAP) para lidar com isso.

Sockets será erro se a conexão cair; escrever seu programa de tal forma que você não perca nenhuma informação no caso de um erro, durante uma gravação à tomada e que você não ganhar qualquer informação no caso de um erro durante a leitura da tomada. Transacionalidade e atomicity devem ser enroladas em seu protocolo cliente / servidor (novamente, supondo que você está projetando it yourself).

talvez isso irá ajudá-lo, TCP Keepalive HOWTO ou esta SO_SOCKET

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