iPhone: Bonjour NSNetService adresse IP et le port
Excuse mon iPhone/Objective-C état de novice s'il vous plaît!
J'ai trouvé mon serveur HTTP à l'aide de NSNetServiceBrowser, mais maintenant je veux juste l'adresse IP et le port du service trouvé.
J'ai quelque chose comme ce qui suit dans mon délégué méthode:
NSNetService* server = [serverBrowser.servers objectAtIndex:0];
NSString *name = nil;
NSData *address = nil;
struct sockaddr_in *socketAddress = nil;
NSString *ipString = nil;
int port;
uint i;
for (i = 0; i < [[server addresses] count]; i++)
{
name = [server name];
address = [[server addresses] objectAtIndex:i];
socketAddress = (struct sockaddr_in *)
[address bytes];
ipString = [NSString stringWithFormat: @"%s",
inet_ntoa (socketAddress->sin_addr)];
port = socketAddress->sin_port;
NSLog(@"Server found is %s %d",ipString,port);
}
mais la boucle n'est jamais entré, même si le délégué est appelé. Des idées? Merci!
Comme un autre commentaire, pour la boucle que vous avez là est considéré comme une mauvaise forme (et lent). Vous devez utiliser le renforcement de la boucle for: for (NSData *addressData dans [serveur addressses]) { ...
OriginalL'auteur Nicholas Gresham | 2009-06-02
Vous devez vous connecter pour publier un commentaire.
Je me rends compte que c'est un vieux thread, mais je viens de courir à travers ce aussi bien. Il y a quelques problèmes avec le code ci-dessus:
IPv6 savvy. À un
minimum, il doit détecter et
jetez les adresses IPv6 si le reste
de votre application ne peut gérer v4
adresses, mais, idéalement, vous devriez être en
prêt à passer à la fois de l'adresse
les familles en amont.
L'affectation de port seront
générer des valeurs incorrectes pour les processeurs Intel
les processeurs. Vous avez besoin d'utiliser
htons
pour résoudre ce problème.
D'Andrew, a noté ci-dessus, le
itération doit utiliser l'interface
pour la boucle.
(EDIT: Ajout de la ce), Comme indiqué sur un autre sujet, l'utilisation de
inet_ntoa
est déconseillée au profit deinet_ntop
.Mettre tout cela ensemble, vous obtenez:
Au lieu de 100 vous pouvez utiliser l'une des constantes
INET6_ADDRSTRLEN
ouINET_ADDRSTRLEN
.Ce code n'est pas correct pour les adresses IPv6. Vous êtes à l'aide de l'IPv4 structure sockaddr_in. Ce qui est cohérent avec l'IPv6 pour les 2 premiers membres de structure, mais pas après.
J'ai par la suite mis à jour le code ci-dessus pour gérer les adresses ipv6 correctement.
Ridiculement utiles, merci! J'aime le code tellement j'ai fait un remix dans une catégorie ci-dessous.
OriginalL'auteur escouten
La NSNetService vous obtenez de retour dans la fonction de rappel n'est pas prêt à être utilisé. Vous devez appeler la méthode suivante pour obtenir des adresses pour:
Mettre en œuvre les NSNetService délégué méthode pour savoir quand il décide:
À ce point, il devrait y avoir au moins une adresse dans le service.
Aussi, prenez soin de lire la documentation et le fichier d'en-tête de soin! Il y a une complexité de la question que j'ai soulevé.
OriginalL'auteur Andrew Pouliot
Remix de la accepté de répondre dans une catégorie:
NSNetService+Util.h
NSNetService+Util.m
[Oui, je n'ai pas peur de créer beaucoup de
NSObject
instances...]OriginalL'auteur Dan Rosenstark