2017-07-10 4 views
1

L'objectif de cet article est de comprendre comment implémenter un timeout Keep-Alive sur un serveur HTTP Boost ASIO.Serveur Boost ASIO - détection de la connexion inactive

Il y a 2 parties à cette -

  1. Lorsque le client a fermé la connexion
  2. Lorsque la connexion client est inactif

Je crois, 1) ci-dessus peut être détectée par la mise en les options TCP_KEEPIDLE, TCP_KEEPCNT et TCP_KEEPINTVL sur le descripteur de socket natif.

Quelle est la meilleure façon de détecter 2) ci-dessus?

J'ai essayé de définir SO_RCVTIMEO et SO_SNDTIMEO sur le socket natif, mais le serveur ne semble pas fermer la connexion à la fin de l'intervalle de temporisation configuré.

Les pointeurs sont très appréciés.

Merci!

+0

Si le client ferme sa connexion bien, alors votre fin de la connexion sera marquée comme lisible (si vous utilisez l'interrogation), puis 'read' ou' recv' retournera '0'. –

Répondre

2

Vous souhaitez détecter le cas où le client ne vous a rien envoyé depuis un certain temps. Vous pouvez le faire en utilisant un temporisateur dans Asio: How do I make the boost/asio library repeat a timer?

Construisez un objet temporisateur par client ou construisez un temporisateur global et vérifiez le dernier message reçu pour tous les clients chaque fois que le temporisateur se déclenche.

SO_RCVTIMEO ne vous aidera pas, car quand il expire l'appel de réception renvoie EAGAIN ou similaire, et Asio ne fera probablement rien avec cela. Lire à ce sujet ici: SO_RCVTIME and SO_RCVTIMEO not affecting Boost.Asio operations