从UDP服务器消息中检索string

我在我的基于Swift的iOS应用程序中使用CocoaAsyncSocket库。 我已经创build了一个asynchronousUDP套接字到我的networking上的UDP服务器,并发送回答。

我正在阅读这样的答复:

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) } 

这是结果:

 didReceiveData From 192.168.1.114 wþÀ¨r 

正如你所看到的,这是一群奇怪的人物。

原始数据是<100277fe c0a80172 00000000 00000000> (通过写入println(data) )。 这里的前4个字节看起来就是wþÀ¨r部分,接下来的4个是IP地址,我已经从getHost()函数中得到了。

我似乎无法find任何帮助函数来提取UDP服务器接收到的实际数据。 我知道UDP回复的ASCII表示是“你好”。 但是,如果我将其更改为其他内容,则不会反映在我在Xcode的debugging部分中看到的数据中。 它永远wþÀ¨r

我已经尝试了NSASCIIStringEncodingNSUTF8StringEncoding ,但后者导致EXC_BAD_ACCESS运行时exception。

据我所知,这是人们通常在Objective-C( didReceiveData函数内部)中做到的:

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

如何在UDP回复中查找“hello”消息作为string表示forms?

您将地址分配给第一行中的数据variables,从而覆盖数据中的值。

 let data = address 

我复制你的代码来尝试其他的东西,并注意到错误。

消息的格式很可能不是你想象的那样,或者你发送了错误的数据。 为什么你认为数据包的有效载荷完全是“你好”,没有额外的(应用层)头? 你看过Wireshark或tcpdump的networking连接来validation吗?

事实上,第一个字节正好是消息的长度(16字节),并且您指出字节3-7是IP地址,我强烈怀疑您的消息具有某种标题,这就是您看着这里。

这是相当愚蠢的,但消除!didReceiveData data: NSData! 部分udpSocket函数解决了这个问题。

也就是说,函数应该像这样定义:

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