Question

Je me sers cocoaasyncsocket en tant que client à un serveur de Windows en utilisant AsyncSocket. J'encodage des messages en utilisant protocol buffers. Ensemble, ceux-ci font un grand ensemble d'outils.

Mais récemment j'ai remarqué que si je quitte le client connecté au serveur pendant une longue période - plusieurs heures - lorsque je tente de faire une demande de données, le message semble obtenir envoyé mais jamais arrive sur le serveur. J'appelle cela une déconnexion « silencieuse » parce que je ne reçois pas la déconnexion habituelle que je le ferais s'il y avait un problème de réseau.

Je traitais les méthodes suivantes dans mon effort pour déboguer, mais aucun d'entre eux s'appelle:

- (NSTimeInterval)onSocket:(AsyncSocket *)sock
  shouldTimeoutReadWithTag:(long)tag
                   elapsed:(NSTimeInterval)elapsed
                 bytesDone:(CFIndex)length {

- (void)onSocket:(AsyncSocket *)sock willDisconnectWithError:(NSError *)err

- (void)onSocketDidDisconnect:(AsyncSocket *)sock

Sans notification, je trouve cela difficile à déboguer. Le serveur ne montre pas de la même déconnection.

ce que quelqu'un soit capable de me diriger dans une direction à la façon d'analyser davantage ce?

Merci.

Était-ce utile?

La solution

Si vous voulez savoir que vos clients et les serveurs sont connectés, vous devez avoir un rythme cardiaque ou « keepalive », à savoir un message de niveau d'application qui est échangé essentiellement en disant: « Êtes-vous là-bas » / « oui ».

Ceci est particulièrement vrai de nos jours autant de routeurs baisseront en silence les connexions TCP inactives. Ce n'est pas ce que TCP a été conçu pour, mais il est un fait de la vie.

TCP a une option pour envoyer heartbeat-couche de connexion ou keepalive avec SO_KEEPALIVE, mais historiquement il y avait un argument de savoir si cela était approprié. Les concepteurs ont estimé que la suppression d'une prise en raison d'un problème de réseau temporaire intermédiaire était erroné. Si aucune donnée n'a été effectivement envoyé au cours de cette période, il n'y avait aucune raison de laisser tomber la connexion. D'autres ont estimé que de savoir si la connexion était bon était important en soi. Que faire si vous attendiez données, mais il était pas arrivé? Woudln't vous voulez savoir?

En fin de compte, il dépend de l'application. Si « aucune nouvelle information » est une affirmation de ce qui est important pour votre application (par exemple les flux d'information, commandes, changements de prix des données du marché), vous devez vérifier que « aucune nouvelle information » est un véritable « aucune nouvelle information "pas une « connexion a été interrompue en silence ». Cela signifie un message explicite.

Alors, comment devrait vous envoyer souvent?

Cela dépend d'un équilibre des choses. 1a) à quelle fréquence vous obtenez normalement mises à jour? 1b) Dans les temps de latence est acceptable / normal (par exemple, si cela fait partie d'un processus, d'autres étapes ont typiquement heures, puis 5-10 minutes pourrait être acceptable). 2a) de la batterie et 2b) l'utilisation des données en raison de battement de coeur. Je soupçonne que l'effet sur la batterie / puissance sera crucial, mais tous ces éléments doivent être examinés attentivement, et équilibré.

Vous pourriez perdre la couverture à tout moment après tous (tunnels, etc.). Je courrais le rythme cardiaque que si vous avez eu aucune mise à jour après quelque chose entre 0,5 et 5 fois l'intervalle de mise à jour en moyenne. Donc, si vous vous attendez à 2 mises à jour par minute, les battements de coeur d'exécution en cas d'inactivité pendant 15 secondes à 3 minutes - juger ce qui est le mieux. À condition que l'utilisateur est dans l'application « live » et « tours hors tension » lorsque vous avez terminé, la durée de vie de la batterie n'est pas une telle question, car ils utilisent de toute façon. Autonomie de la batterie est vraiment un problème si vous éveillez l'appareil pour traiter les mises à jour.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top