我在基于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
。
我已尝试使用NSASCIIStringEncoding
和NSUTF8StringEncoding
,但后者导致EXC_BAD_ACCESS
运行时异常。
据我所知,这是人们通常在Objective-C(didReceiveData
函数内部)中执行此操作的方式:
NSString *msg = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
如何找到&#34;你好&#34; UDP回复中的消息作为字符串表示?
答案 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!) {
....
}