Maintenir une connexion de socket vivant dans iOS
J'ai le code suivant écrit en Objective-C qui écrit des données sur un support. Le serveur est en cours d'exécution node.js sur le dessus de Ubuntu:
NSString *url = @"anIPAddress";
CFReadStreamRef readStream;
CFWriteStreamRef writeStream;
CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)url, 9000, &readStream, &writeStream);
self.inputStream = (NSInputStream *)readStream;
self.outputStream = (NSOutputStream *)writeStream;
[self.inputStream setDelegate:self];
[self.outputStream setDelegate:self];
[self.inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[self.outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[self.inputStream open];
[self.outputStream open];
Je suis en mesure de se connecter au serveur et d'envoyer des informations. Cependant j'ai remarqué que le temps de connexion au bout de quelques minutes (je pense que 5 minutes?). Comment puis-je garder cette connexion? Je sais il y a un décalage parce que la même chose arrive si je me connecter au serveur Terminal server, je dois maintenir en vie. J'imagine que la même chose se passe dans mon code. Merci pour votre aide!
Pour Objective-C du code qui fonctionne, veuillez consulter la réponse suivante...
OriginalL'auteur Hahnemann | 2012-07-08
Vous devez vous connecter pour publier un commentaire.
La réponse la plus simple est d'essayer d'utiliser le
SO_KEEPALIVE
option de socket.D'interruptions dans la connexion peut être difficile à détecter sans données circulant entre les points d'extrémité qui est ce qui rend cette option dans certaines façons inutile car elle ne permet pas d'utiliser les données afin de détecter les connexions rompues. Cependant, il est facile d'ajouter à votre code pour voir. Ajouter et voir si ça aide...
C'est comment c'est fait en C ou C++
La pas-si-réponse simple est d'ajouter un
ping
paquet à votre protocole et envoyer des paquets ping régulièrement de sorte que vous pouvez détecter une coupure de connexion.Je ne sais pas Objective-C, donc je ne sais pas. Cependant, je suis prêt à parier il y a une trappe d'évacuation de faire des appels à C libs.
Jetez un oeil ici: developer.apple.com/library/ios/DOCUMENTATION/CoreFoundation/... et voir si ça aide.
Je reçois ce message d'erreur : "impossible de définir keepalive! ERRNO: opération de Socket sur la non-prise" Ce qui pourrait être la raison et la solution possible?
Salut, qu'est-ce que getNativeSocketHandle()
OriginalL'auteur JimR
J'ai trouvé comment faire. Étant donné que le serveur est en cours d'exécution node.js j'ai utilisé
Et de cette manière, node conserve chaque socket ouvert. La valeur par défaut est false, donc c'est pourquoi il a été l'expiration du délai. J'espère que ce sera utile à d'autres personnes. Merci beaucoup pour vos réponses, je pense que garder un battement de cœur (keep-alive) est aussi une bonne idée, mais avec cette approche autochtone nœud prend soin de lui.
il vous montrant comment il l'a fait sur le serveur - voir ci-dessous la réponse par moi pour savoir comment faire sur iOS.
OriginalL'auteur Hahnemann
En supposant un NSOutputStream *oStream;
Sur iOS faire de cette façon:
Je poste ce depuis que j'ai juste passé des heures à travailler, veulent économiser de quelqu'un d'autre l'effort.
homme 2 setsockopt ou de recherche sur setsockopt dans Xcode documentation de vue.
Seulement Apple pouvait faire quelque chose de si simple, de si compliqué. J'ai programmé en réseau des applications en utilisant les Sockets de Berkeley, et il est moins compliqué que cela.
D'où le besoin d'écrire cette méthode ?
juste après que vous obtenez une référence pour le flux de sortie.
OriginalL'auteur David H
Vous avez besoin de transmettre des ordures sur la connexion. Essayez ceci:
Puis de déclarer ce dans
self
:Remarque: Remplacer `"Keepalive!" avec tout ce que vous voulez pour votre protocole. La seule exigence est que l'extrémité distante (serveur socket) ignore le message.
Combien de temps faut-il pour que la connexion à mourir? Calendrier un peu avant que.
dans certains cas, au lieu de "déchets", vous pourriez envisager ce "battement de coeur" données sur la socket serveur. UPVOTED! 🙂
Merci.
Qu'est-ce que sockfd?
OriginalL'auteur Linuxios