我正在尝试从UDP套接字读取数据。我正在使用Xcode 9.2和Swift,我希望在没有外部库的情况下实现通信。我可以发送数据(使用Packet Sender进行测试),但问题是当我发回数据包并尝试读取数据时。我的套接字回调函数被调用,回调类型匹配数据回调。如果我尝试使用指针从内存加载CFData,操作不会崩溃。然后,当我尝试在该对象上使用CFDataGetLength或类似函数时,应用程序崩溃。
func socketCallback(socket: CFSocket?, callbackType: CFSocketCallBackType, address: CFData?, data: UnsafeRawPointer?, info: UnsafeMutableRawPointer?) {
if callbackType == CFSocketCallBackType.dataCallBack {
print("dataCallback called.")
let cf = data!.load(as: CFData.self)
print(cf) // prints __NSCFData
print(CFDataGetLength(cf)) // crashes
}
}
抛出异常: 因未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'+ [__ NSCFData length]:无法识别的选择器发送到类0x10ca08348'
其他CFData函数的异常,不仅仅是CFDataGetLength,例如
var bytes = [UInt8]()
print(CFDataGetBytes(cf, CFRange(location: 0, length: 3), &bytes))
我试图从内存中读取一些数据作为无符号字节,指针(数据)和偏移量:
var array = [UInt8]()
for i in 0...55 {
let pointer = data! + i
array.append(pointer.load(as: UInt8.self))
}
print(array, separator: ", ", terminator: "\n")
它打印以下内容:
[72,67,103,5,1,0,0,0,132,20,0,0,1,0,0,0,3,0,0,0,0,0,0, 0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 97,97,97,0,0,0,0,0]
我注意到数字3是消息的长度,字节48,49和50是数据(我发送了“aaa”,97是ascii中的“a”)。
套接字初始化代码:
var socket = CFSocketCreate(nil, PF_INET, SOCK_DGRAM, IPPROTO_UDP, CFSocketCallBackType.dataCallBack.rawValue, socketCallback, nil)
let runLoopSource = CFSocketCreateRunLoopSource(nil, socket, 0)
CFRunLoopAddSource(CFRunLoopGetMain(), runLoopSource, CFRunLoopMode.defaultMode)
我发现的大多数信息都是针对ObjC的,我对ObjC并不是很熟悉。
我做错了什么?