Bonne réception des packets
TomDev
Membre
Bonjour,
J'utilise actuellement SmallSocket pour utiliser les sockets mais je rencontre un problème lorsque le serveur m'envoie plusieurs messages très rapidement mon programme va recevoir que 2 messages sur 3 par exemple mais il lis le premier saute le second et lis le dernier. J'utilise une boucle qui détecte dés qu'il à reçu au moins 1 caractère il stop puis passe à la seconde boucle ect...
J'en est déduis que le problème est plutôt temporelle (le serveur envoie les trois messages avec une intervalle trop courte).
Mais je ne trouve pas de solution.
Merci d'avance pour votre aide.
Edit :
Voici un exemple de code après avoir créer mon socket :
(Je précise que mon code est un exemple donc pas de gestion de mémoire et mes boucle dans ces exemple sont infinis mais j'ai une gestion d'erreurs au cas où il n'y a pas de connexion ou que trop de temps c'est passer pour recevoir le message).
J'utilise actuellement SmallSocket pour utiliser les sockets mais je rencontre un problème lorsque le serveur m'envoie plusieurs messages très rapidement mon programme va recevoir que 2 messages sur 3 par exemple mais il lis le premier saute le second et lis le dernier. J'utilise une boucle qui détecte dés qu'il à reçu au moins 1 caractère il stop puis passe à la seconde boucle ect...
J'en est déduis que le problème est plutôt temporelle (le serveur envoie les trois messages avec une intervalle trop courte).
Mais je ne trouve pas de solution.
Merci d'avance pour votre aide.
Edit :
Voici un exemple de code après avoir créer mon socket :
[socketT connectToHostName:@"XXX.XXX.XXX.XXX" port:XXX];<br /> NSMutableData *reponse = [NSMutableData data];<br /> while ([socketT readData:reponse] <= 0) {<br /> <br /> }<br /> NSString *receiveData = [[NSString alloc] initWithData:reponse encoding:NSUTF8StringEncoding];<br /> NSLog(@"Reçu : %@",receiveData);
Comme sa j'arrive à recevoir un message mais si jamais je devais en recevoir plusieurs là je plante j'ai essayer comme sa :
[socketT connectToHostName:@"XXX.XXX.XXX.XXX" port:XXX];<br /> NSMutableData *reponse = [NSMutableData data];<br /> while ([socketT readData:reponse] <= 0) {<br /> <br /> }<br /> NSString *receiveData = [[NSString alloc] initWithData:reponse encoding:NSUTF8StringEncoding];<br /> NSLog(@"Reçu : %@",receiveData);<br /> NSMutableData *reponse2 = [NSMutableData data];<br /> while ([socketT readData:reponse2] <= 0) {<br /> <br /> }<br /> NSString *receiveData2 = [[NSString alloc] initWithData:reponse2 encoding:NSUTF8StringEncoding];<br /> NSLog(@"Reçu : %@",receiveData);
Mais cela ne me permet pas de recevoir le second message pourtant si j'utilise un sniffeur de packet j'ai bien reçu 2 messages mais mon programme ne l'a pas detecter.(Je précise que mon code est un exemple donc pas de gestion de mémoire et mes boucle dans ces exemple sont infinis mais j'ai une gestion d'erreurs au cas où il n'y a pas de connexion ou que trop de temps c'est passer pour recevoir le message).
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Car je pense que le problème vient de cette classe.
As tu essayé d'utiliser les sockets via NSStream ?
C'est natif cocoa, donc cela est peut-être plus robuste.
Merci de ta réponse.
En lisant le companion-guide donné en lien par Ali, tu y verras comment utilisant les sockets de manière asynchrone (via un delegate). Ainsi, il n'y aura que peu de chance de perdre des données.
hmm... Ce projet ne semble plus maintenu, la dernière version publique en 0.6 date de 2001. Pour l'histoire, NSStream a vu le jour avec Mac OS 10.3 publié en 2003.
(Merci pour l'exemple).
Moi j'aurais besoin d'envoyer un paquet, non pas à une adresse IP mais directement à une adresse MAC. Et pour ça j'ai besoin de construire l'entête Ethernet moi même à la main.
Or je n'ai pas l'impression que NSStream puisse me permettre ça?
Tu ne peux pas faire une requête RARP pour obtenir l'adresse IP de la machine à partir de son adresse MAC ? C'est un peu bas niveau aussi, mais au moins une fois que tu as l'adresse IP tu te retrouves dans un use case classique et tu peux utiliser les classes et les fonctions réseau classiques...
Une requête RARP sur une sorte d'adresse MAC "broadcast" et je dois enregistrer l'IP de la première réponse.
Donc pour la requête RARP je pensais passer par NSStream ou bien CFSocket mais je ne m'y connais que très peu et c'est franchement pas évident. Je cherche des tutos qui pourrais me donner des exemples mais dur dur de trouver quelque chose qui fonctionne.
Clairement pas. NSStream propose un niveau d'abstraction bien trop élevé, et fonctionne, dans le cas des communications réseau, exclusivement en TCP, qui n'est pas le bon protocole pour faire des requêtes RARP...
La seule solution que je vois, c'est l'ouverture de sockets en mode "RAW", ce qui permet de définir soi même le contenu complet d'un paquet, y compris l'entête. Et faire cela, la solution la plus simple est de consulter le code source d'un outil sachant faire du rarp (il en existe sans doute en opensource).
http://www.wireshark.org/
il y a la version mac et le code source
A+
Merci