从UDP服务器消息中检索字符串

时间:2014-09-13 15:07:42

标签: ios swift udp cocoaasyncsocket

我在基于Swift的iOS应用中使用CocoaAsyncSocket库。我已经为我网络上的UDP服务器创建了一个异步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()函数中重新获得了。

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

我已尝试使用NSASCIIStringEncodingNSUTF8StringEncoding,但后者导致EXC_BAD_ACCESS运行时异常。

据我所知,这是人们通常在Objective-C(didReceiveData函数内部)中执行此操作的方式:

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

如何找到&#34;你好&#34; UDP回复中的消息作为字符串表示?

3 个答案:

答案 0 :(得分:2)

您在第一行中为数据变量分配了地址,从而覆盖了数据中的值。

let data = address

我复制了你的代码以尝试别的东西并注意到错误。

答案 1 :(得分:1)

很可能,邮件的格式根本不是您认为的,或者您发送错误的数据。为什么你认为数据包的有效载荷完全是&#34;你好&#34;没有额外的(应用程序层)标头?你有没有看过与Wireshark或tcpdump的网络连接来验证?

事实上,第一个字节正是消息的长度(16个字节),并且您指示字节3-7是IP地址,我强烈怀疑您的消息具有某种类型的标头,并且&# 39,你在这里看到的是什么。

答案 2 :(得分:0)

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

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

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