IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Objective-C Discussion :

Socket en Objective C


Sujet :

Objective-C

  1. #1
    Invité
    Invité(e)
    Par défaut Socket en Objective C
    Bonjour, je rencontre de petits problèmes sur mon projet. Je doit établir une connexion par socket avec un afficheur.

    Pour cela j'ai utiliser la méthode : CFStreamCreatePairWithSocketToHost

    Voici mon code :
    Je recupere l'adresse dans mon UITextField
    Puis ma methode relier a mon bouton configurer envoi a ma classe socket l'adresse
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    - (IBAction)validerConfiguration {
    	NSLog(@"Valeur d'addrIp = %@", addrIp);
    	[maSocket connexionSuperviseur:addrIp]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    - (void) connexionSuperviseur:(NSString *)url {
     
    	NSLog(@"Opening connection with %@", url);
    	if ([url isEqualToString:@""])
    		return;
    	server = [NSURL URLWithString:url];
    	if (!server){
    		NSLog(@"Bad address: %@", url);
    		return;
    	}
     
    	CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)[server host], 2000, &readStream, &writeStream); 
     
     
    	if (readStream != nil || writeStream != nil)
    	{	
    		inputStream = (NSInputStream *)readStream;
    		outputStream = (NSOutputStream *)writeStream;
     
    		[inputStream open];
    		[outputStream open];
    		NSLog(@"Should be connected");
     
    		[self sendString:@"test"];
    	}
     
    }
    Quand je passe une adresse style 192.168.100.53, l'application plante dès que j'appuis sur le bouton et ne lance pas la méthode connexionSuperviseur et affiche “EXC_BAD_ACCESS”.

    Quand je passe aucune valeur, sa passe partout et m'affiche correctement "Bad address"

    Je comprend vraiment pas d'ou viens l'erreur, car même en ne mettant que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    - (IBAction)validerConfiguration {
    	NSLog(@"Valeur d'addrIp = %@", addrIp);
    }
    Cela devrai juste m'afficher la valeur de ma variable, mais mon programme me renvoi encore “EXC_BAD_ACCESS”

    Si quelqu'un pouvais m'eclairer. Je vous en remercie

  2. #2
    Membre régulier
    Inscrit en
    Octobre 2010
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 62
    Points : 85
    Points
    85
    Par défaut
    Bonjour, quel est le format de ta variable : addrIp ?

    Si c'est un NSString, alors le problème ne vient pas du log mais de sa liaison apparemment.

    Sinon si c'est un int, il faut faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    NSLog(@"Valeur d'addrIp = %d", addrIp);
    Sinon si c'est un float, il faut faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    NSLog(@"Valeur d'addrIp = %f", addrIp);
    En fonction du type utilisé, utilise le bon format

    Voilà qui pourra t'être utile : format NSLog

    ++

    ------
    edit
    ------

    Je viens de voir que ta méthode attendait un NSString, donc apparemment ça ne viendrait pas de là.

    Tu alloues bien ta variable ?

    Met un point d'arrêt sue le NSLog, est vérifie qu'elle n'est pas null.

    ++

  3. #3
    Invité
    Invité(e)
    Par défaut
    Merci, c'est bien ce que j'ai fait, mais le compilateur m'affiche directement "EXC_BAD_ACCESS" quand il arrive sur le NSlog, je n'arrive pas a comprendre d'ou sa viens.. la je viens tous déporter dans la même méthode, de la façon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    - (IBAction)validerConfiguration {
    	addrIp=[champIp text]; 
    	[labelIp setText:addrIp]; 
    	NSLog(@"Valeur d'addrIp = %@", addrIp);
    	[maSocket connexionSuperviseur:addrIp];
    Et maintenant plus de soucies, sa envoi correctement mon objet dans la méthode de ma classe socket. J'aimerais quand même savoir pourquoi j'ai ce problème..

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 937
    Points : 4 358
    Points
    4 358
    Par défaut
    Citation Envoyé par Pepit074 Voir le message
    Merci, c'est bien ce que j'ai fait, mais le compilateur m'affiche directement "EXC_BAD_ACCESS" quand il arrive sur le NSlog, je n'arrive pas a comprendre d'ou sa viens.. la je viens tous déporter dans la même méthode, de la façon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    - (IBAction)validerConfiguration {
    	addrIp=[champIp text]; 
    	[labelIp setText:addrIp]; 
    	NSLog(@"Valeur d'addrIp = %@", addrIp);
    	[maSocket connexionSuperviseur:addrIp];
    Et maintenant plus de soucies, sa envoi correctement mon objet dans la méthode de ma classe socket. J'aimerais quand même savoir pourquoi j'ai ce problème..
    addrIp est probablement une valeur autoreleased
    Dans votre première version : entre le moment où vous créez/assignez cette variable et le moment où la méthode est appelée suite à une action de l'utilisateur, le programme est passé par la boucle principale qui alloue un pool temporaire qui est purgé à chaque passage, donc votre variable n'a pas survécu et le BAD_ACCESS signifie que vous accédez à une zone mémoire qui a été libérée.
    Il manque donc simplement un retain sur cette variable et évidemment le release correspondant lorsque vous n'en aurez plus besoin, probablement le dealloc de la classe qui contient cette variable d'instance (à moins que addrIp soit autre chose qu'une variable d'instance…)

  5. #5
    Invité
    Invité(e)
    Par défaut
    Merci beaucoup pour votre explication, en effet un simple retain sur l'objet et tous roule

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. executer une application a distance : Sockets ? RPC ? CORBA?
    Par a_hic dans le forum Développement
    Réponses: 5
    Dernier message: 30/05/2006, 13h02
  2. raw socket et langage c
    Par SlayDave dans le forum Développement
    Réponses: 2
    Dernier message: 29/08/2002, 19h09
  3. socket
    Par ben91 dans le forum Développement
    Réponses: 5
    Dernier message: 13/08/2002, 11h04
  4. Socket:Envoyer du texte d'un serveur vers tout les clients
    Par cedm78 dans le forum Web & réseau
    Réponses: 7
    Dernier message: 01/08/2002, 16h40
  5. transfert d'un fichier bitmap en socket tcp
    Par localhost dans le forum C++Builder
    Réponses: 5
    Dernier message: 29/07/2002, 00h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo