7
votes

Comment définir le délai de conservation de Keepalive dans Android?

J'aimerais réduire le temps de conserve TCP sur une prise que j'ouvrie de 2 heures à quelque chose de l'ordre de dix minutes. Je peux le faire utiliser Keepalive avec Socket.Sekeekeealive (True), mais comment puis-je contrôler le temps avant l'envoi d'un paquet Keepalive?

On dirait que je pouvais le faire si j'utilisais le NDK, mais je veux distribuer ce code sous forme de pot, donc ce n'est pas idéal pour moi.


0 commentaires

3 Réponses :


1
votes

Ceci est probablement trop évident une réponse [c'est-à-dire Ce n'est pas une option pour votre cas spécifique] mais vous pouvez bien sûr mettre en œuvre votre propre Keepalive en envoyant un octet à deux jettes (dans les deux sens) toutes les 10 minutes.


1 commentaires

Oui, je vais probablement finir par faire ça. J'entends que cela soit plus taxé sur la vie de la batterie pour le faire, cependant. Je peux définir le service Keepalive du serveur qui, espérons-le, est raisonnable.



3
votes

Android est basé sur Linux, et Linux prend en charge le tcp_keeditle tcp_keekinvl Options de socket via la fonction setSocketOpt () la fonction, qui est enveloppée par L'interface java.net.socktOptions . java.net.socketImpl Implements SocketOptions et java.net.sockt wraps a socketimpl . Ce que je ne sais pas, c'est qu'il est possible d'accéder au socketimpl d'une prise donnée .

Ce que vous pourriez essayer de faire est d'utiliser socket.setsocketImplactory () Pour implémenter votre propre socketMplactory classe, qui est responsable de la création de socketimpl Instances pour socket objets. De cette façon, votre usine pourrait appeler socketoption.setoption () pour tcp_keeidle et tcp_keeketvl pour toutes les prises de vue de votre application.


2 commentaires

+1 Pour un indice d'utilisation de TCP_Kekeedidle et TCP_ekeeketvl dans le cas de Android. Mais Ce vote pour la mise en œuvre du niveau d'application et non du niveau système Keepalive. Quelle est votre opinion?


Cette question était spécifiquement sur le niveau de service du système, que chaque plate-forme prend en charge car elle fait partie de la SEC TCP (bien que toutes les plateformes ne prennent pas en charge la définition de l'intervalle). Le service Keepalive de niveau de l'application dépend du protocole et de nombreux protocoles ne prennent pas en charge un niveau de maintien au niveau de l'application. Si Un service de garde au niveau de l'application est possible, par tous les moyens l'utiliser. Mais revenez au niveau du système Keepalive si nécessaire.



11
votes

Je pense que cela pourrait être assez important de pouvoir définir les délais de conserve sur un niveau par application , en particulier sur un appareil mobile , parce que cela pourrait être sous mauvaises conditions de réseau (WiFi / Mobile). Si l'application n'envoie pas (m) des données mais utilise une connexion persistante , la prise ne détectera pas si la connexion est perdue , sauf si Il envoie des sondes de conserve TCP. Réglage de cette option est généralement possible via le setSockopt (2) Appelez, mais le SDK Android ne fournit que l'option Seeservalive (Boolean) . Plus profondément dans la pile, ces fonctions appelle libcore.io.forwardingos.setsockoptint (...) , qui est non disponible directement , ni le descripteur de fichier requis. en utilisant la réflexion Java, le réglage des délais de conserve est possible de toute façon , par exemple comme ceci: xxx

Ceci fonctionne au moins jusqu'à ce que Les exigences suivantes sont remplies:

  • libcore.forwardingos.setsockoptitint / 4 existe à la version actuelle SDK
  • java.net.sockt a un membre Impl à la version SDK actuelle
  • java.net.sockt- >ac est une instance de java.net.socketimpl à la version SDK actuelle
  • java.net.socketimpl a un membre fd à la version SDK actuelle
  • tcp_keeditle , tcp_keeketvl et tcp_keekecnt avoir les mêmes valeurs ( 4 , 5 et 6 ) à la version actuelle de la version SDK et Tous les appareils Android / Architectures.

    qui semble être vrai au moins pour les versions Android de 4.0.1 / novembre 2011 jusqu'à Version récente 5.1.1 R9 .

    Voir Luni / SRC / MAIN / JAVA / LIBCORE / IO / OS.JAVA , Luni / SRC / Main / Java / Java / Net / Socket.java et Luni / SRC / Main / java / java / net / socketimpl.java de Plate-forme / libcore référentiel . tcp_keeditle , tcp_keeketvl et tcp_keekecnt semble avoir les mêmes valeurs pour les versions Android depuis 2.2.3 R2 et toutes les architectures. Cela peut être validé par exemple. En exécutant trouver. -Name TCP.H | xargs grep -ho "tcp_keekee \ w \ + \ s \ + \ d \ +" | Trier | UNIQ -C dans le Plateforme Android / NDK référentiel. < / p>


1 commentaires

Excellent! J'ai toujours pensé que Linux et Android pourraient avoir les mêmes paramètres, mais ces paramètres corrigent les problèmes que j'ai vus dans mon code Garder_alive sur Android :-) Merci beaucoup.