2010-01-31 10 views
1

Je reçois une connexion au serveur et je suis dans ma fonction de rappel:Convertir NSData à NSString

Je suis en train d'obtenir le nom de l'hôte et l'impression que ma console:

if(theType == kCFSocketConnectCallBack){ 
     NSLog(@"Connection is accepted"); 
     CFSocketNativeHandle nativeSocket = CFSocketGetNative(theSocket); 
     uint8_t name[SOCK_MAXADDRLEN]; 
     socklen_t namelen = sizeof(name); 
     NSData *peer = nil; 
     if (getpeername(nativeSocket, (struct sockaddr *)name, &namelen) == 0) { 
      peer = [NSData dataWithBytes:name length:namelen]; 
      NSString *string = [[NSString alloc] initWithData:peer encoding:NSUTF8StringEncoding]; 
      NSLog(@"IP adress of connected peer: %@", string); 
     } 

Lorsque j'exécute l'application en mode débogage, je peux voir la valeur de l'adresse IP assignée au nom, donc elle réussit à obtenir le nom, chaque valeur est uint8_t .. La longueur de l'homologue est 16; Mon problème convertir en NSData puis NSString ...

sortie: 2010-01-31 13: 57: 58,671 adresse IP de pairs connectés: (null)

Ma chaîne est d'être sortie comme NULL,

Tout conseil est apprécié, merci ....

+0

Avez-vous trouvé quelque chose qui fonctionne toujours? –

Répondre

1

Tout d'abord, assurez-vous que peer contient une instance de NSData qui est non nulle en longueur. Si tel est le cas, le problème le plus probable est que les données ne correspondent pas au codage spécifié, ce qui entraîne l'échec de l'encodage pour NSString et le retour d'une chaîne nulle. S'il s'agit d'un problème de codage, il existe une API sur NSString pour effectuer des codages avec perte. Même si la perte de votre solution finale n'est pas acceptable, il peut être très utile de déterminer ce qui ne va pas.

Cela suppose par NULL que vous voulez vraiment dire nil. Il serait utile de coller la sortie exacte de la ligne de journal. Getpeername() ne renvoie pas le nom d'hôte du côté distant;

+0

ma longueur de pair est 16 J'ai mis à jour ma question pour clarifier les choses un peu plus ... – Unis

2

il renvoie l'adresse:

 
$ man getpeername 

... 

DESCRIPTION 
    The getpeername() function returns the address of the peer connected to 
    the specified socket. 

Vous voulez getnameinfo():

 
$ man getnameinfo 

... 

DESCRIPTION 
    The getnameinfo() function is used to convert a sockaddr structure to a 
    pair of host name and service strings. It is a replacement for and pro- 
    vides more flexibility than the gethostbyaddr(3) and getservbyport(3) 
    functions and is the converse of the getaddrinfo(3) function. 

ou gethostbyaddr():

 
$ man gethostbyaddr 

... 

DESCRIPTION 
    The getaddrinfo(3) and getnameinfo(3) functions are preferred over the 
    gethostbyname(), gethostbyname2(), and gethostbyaddr() functions. 

    The gethostbyname(), gethostbyname2() and gethostbyaddr() functions each 
    return a pointer to an object with the following structure describing an 
    internet host referenced by name or by address, respectively. 
+0

Merci pour la clarification, cependant j'obtiens la bonne information faisant ceci, mais je ne peux pas convertir le pair (NSData) en NSString alors affiche la valeur .... – Unis

+0

Vous ne pouvez pas l'imprimer parce que vous essayez de créer un NSString * avec des données autres que des chaînes de caractères. Si vous voulez l'imprimer, l'appel que vous utilisez ne vous donne pas «la bonne information» pour votre but. – smorgan

2

sockaddr est un struct, pas seulement un typedef pour un tableau de caractères . Vous devez passer getpeername l'adresse à une struct réelle sockaddr, puis générer la chaîne à partir du champ sa_data de cette structure - et cela suppose que sa_data est réellement une chaîne pour votre type d'adresse, que la documentation ne suggère pas vous pouvez compter réellement sur. Comme une autre réponse l'indique, ce n'est pas l'appel que vous voulez si votre objectif est d'obtenir une représentation de chaîne à imprimer.

(En outre, vous n'avez pas besoin NSData du tout pour aller d'un tableau de caractères à un NSString, vous pouvez simplement utiliser -[NSString initWithBytes:length:encoding:])