2014-09-13 1 views
1

J'utilise la bibliothèque CocoaAsyncSocket dans mon application iOS Swift. J'ai créé un socket UDP asynchrone sur un serveur UDP de mon réseau, et il renvoie une réponse.Récupération d'une chaîne à partir d'un message de serveur UDP

Je lis cette réponse comme ceci:

func udpSocket(sock: GCDAsyncUdpSocket!, didReceiveData data: NSData!, fromAddress address: NSData!, withFilterContext filterContext: AnyObject!) { 
    println("didReceiveData") 
    let data = address 

    var host: NSString? 
    var port1: UInt16 = 0 
    GCDAsyncUdpSocket.getHost(&host, port: &port1, fromAddress: address) 
    println("From \(host!)") 

    let gotdata = NSString(data: data, encoding: NSASCIIStringEncoding) 
    //let gotdata: NSString = NSString(data: data, encoding: NSUTF8StringEncoding) 
    println(gotdata) 
} 

Ceci est le résultat:

didReceiveData 
From 192.168.1.114 
wþÀ¨r 

Comme vous pouvez le voir, il y a un tas de personnages étranges. Les données brutes sont <100277fe c0a80172 00000000 00000000> (en écrivant println(data)). Ici les 4 premiers octets semblent être la partie wþÀ¨r, et les 4 suivants sont l'adresse IP, que j'ai déjà récupérée depuis la fonction getHost().

Je n'arrive pas à trouver de fonction d'assistance pour extraire les données réelles reçues par le serveur UDP. Je sais que la représentation ASCII de la réponse UDP est "bonjour". Cependant, si je change cela en quelque chose d'autre, cela ne se reflète pas dans les données que je vois dans la partie de débogage de Xcode. C'est toujourswþÀ¨r.

J'ai essayé les deux avec NSASCIIStringEncoding et NSUTF8StringEncoding, mais ce dernier entraîne une exception d'exécution EXC_BAD_ACCESS.

Pour autant que je pouvais trouver, c'est comment les gens normalement le faire en Objective-C (dans la fonction didReceiveData):

NSString *msg = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 

Comment puis-je trouver le message « bonjour » dans la réponse UDP comme une représentation de chaîne?

Répondre

0

Il est plutôt stupide, mais la suppression ! de la partie didReceiveData data: NSData! de la fonction udpSocket a résolu le problème.

C'est, la fonction doit être définie comme ceci:

func udpSocket(sock: GCDAsyncUdpSocket!, didReceiveData data: NSData, fromAddress address: NSData!, withFilterContext filterContext: AnyObject!) { 
    .... 
} 
+0

Le! En fait un optionnel avec un déballage implicite. Pensez que vous devrez peut-être le rétrograder à NSData. Utilisant inline down casting "comme?" et affecter à la variable locale avant utilisation. – casillic

1

Très probablement, le format du message n'est tout simplement pas ce que vous pensez qu'il est, ou vous envoyez les mauvaises données. Pourquoi croyez-vous que la charge utile du paquet est exactement "bonjour" sans en-tête supplémentaire (couche d'application)? Avez-vous regardé la connexion réseau avec Wireshark ou tcpdump pour valider? Le fait que le premier octet est exactement la longueur du message (16 octets), et vous indiquez que les octets 3-7 sont l'adresse IP, je soupçonne fortement que votre message a une sorte d'en-tête, et c'est ce que vous regardez ici.

2

Vous adresse attribuée à la variable de données dans la première ligne, donc la valeur en écrasant des données.

let data = address 

J'ai copié votre code pour essayer quelque chose d'autre et remarqué l'erreur.

Questions connexes