Comment définir le keepalive délai d'attente dans Android?
Je voudrais baisser le TCP keepalive temps sur un Socket je suis de l'ouverture de 2 heures à quelque chose de l'ordre d'une dizaine de minutes. Je peux utiliser keepalive avec la prise.setKeepAlive(vrai), mais comment puis-je contrôler le temps avant un keepalive paquet est envoyé?
Il semble que je pourrais le faire si j'ai été en utilisant le NDK, mais je veux distribuer ce code comme un pot, ce qui n'est pas idéal pour moi.
Vous devez vous connecter pour publier un commentaire.
C'est sans doute trop évident de réponse [à savoir, ce n'est pas une option pour votre cas spécifique] mais bien sûr, vous pouvez mettre en place votre propre keepalive par l'envoi de 1 jeter octet (dans les deux sens) toutes les 10 minutes.
Je pense qu'il pourrait être assez important pour être en mesure de définir la keepalive délais d'attente sur un par application niveau, surtout sur un appareil mobile, parce qu'il pourrait être dans de mauvaises conditions de réseau (wifi/mobile). Si le application ne prend pas en envoyer (m)toutes les données mais utilise un connexion persistante, la prise de ne pourra pas détecter si la connexion est perdue, à moins qu'il envoie tcp keepalive sondes. Le réglage de cette option est généralement possible via le setsockopt(2) appel, mais le sdk android ne fournit que le
setKeepAlive(boolean)
option. Plus bas dans la pile, que des appels de fonctions libcore.io.ForwardingOs.setsockoptInt(...), qui est pas disponible directement, ni la nécessaire descripteur de fichier. À l'aide de java réflexion, la définition de la directive keepalive délais d'attente est possible de toute façon, e.g comme ceci:Cela fonctionne au moins jusqu'à suivantes exigences sont remplies:
libcore.io.ForwardingOs.setsockoptInt/4
existe à l'actuelle version du sdkjava.net.Socket
a unimpl
membre de l'actuelle version du sdkjava.net.Socket->impl
est instance dejava.net.SocketImpl
à l'actuelle version du sdkjava.net.SocketImpl
a unfd
membre de l'actuelle version du sdkTCP_KEEPIDLE
,TCP_KEEPINTVL
etTCP_KEEPCNT
ont les mêmes valeurs(
4
,5
et6
) à l'actuelle version du sdk et tous les appareils android /architectures.Qui semble être vrai au moins pour les versions d'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
etluni/src/main/java/java/net/SocketImpl.java
de la de plate-forme/libcore référentiel.TCP_KEEPIDLE
,TCP_KEEPINTVL
etTCP_KEEPCNT
semblent avoir les mêmes valeurs pour les versions d'android depuis 2.2.3 r2 et toutes les architectures. Cela peut être validés par exemple en exécutantfind . -name tcp.h | xargs grep -ho "TCP_KEEP\w\+\s\+\d\+" | sort | uniq -c
dans le la plate-forme android/ndk référentiel.Android est basé sur Linux, et Linux prend en charge les
TCP_KEEPIDLE
etTCP_KEEPINTVL
options de prise via lasetsocketopt()
fonction, qui est enveloppé par lejava.net.SocketOptions
interface.java.net.SocketImpl
implémenteSocketOptions
, etjava.net.Socket
enroule uneSocketImpl
. Ce que je ne sais pas s'il est possible d'accéder à laSocketImpl
d'unSocket
objet.Ce que vous pourriez essayer de faire est d'utiliser
Socket.setSocketImplFactory()
pour mettre en œuvre votre propreSocketImplFactory
classe, qui est responsable de la création deSocketImpl
instances pourSocket
objets. De cette façon, votre usine pourrait appelerSocketOptions.setOption()
pourTCP_KEEPIDLE
etTCP_KEEPINTVL
pour tout sockets votre application crée.