从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
。
我已经尝试了NSASCIIStringEncoding
和NSUTF8StringEncoding
,但后者导致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!) { .... }