1

我在基于 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 个字节是我已经从getHost()函数中检索到的 IP 地址。

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

我已经尝试过使用NSASCIIStringEncodingand NSUTF8StringEncoding,但后者会导致EXC_BAD_ACCESS运行时异常。

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

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

如何在 UDP 回复中以字符串表示形式找到“hello”消息?

4

3 回答 3

2

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

let data = address

我复制了您的代码以尝试其他方法并注意到错误。

于 2015-01-08T19:27:09.327 回答
1

很可能,消息的格式根本不是您认为的那样,或者您发送了错误的数据。为什么您认为数据包的有效负载完全是“你好”,没有额外的(应用层)标头?您是否使用 Wireshark 或 tcpdump 观察网络连接以进行验证?

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

于 2014-09-14T04:42:01.257 回答
0

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

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

func udpSocket(sock: GCDAsyncUdpSocket!, didReceiveData data: NSData, fromAddress address: NSData!, withFilterContext filterContext: AnyObject!) {
    ....
}
于 2014-09-19T08:38:54.400 回答