【问题标题】:Retrieving a string from a UDP server message从 UDP 服务器消息中检索字符串
【发布时间】:2023-03-31 02:06:01
【问题描述】:

我在基于 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

NSASCIIStringEncodingNSUTF8StringEncoding 我都试过了,但后者会导致 EXC_BAD_ACCESS 运行时异常。

据我所知,这是人们在 Objective-C 中通常的做法(在 didReceiveData 函数内):

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

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

【问题讨论】:

    标签: ios swift udp cocoaasyncsocket


    【解决方案1】:

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

    let data = address
    

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

        • 该!使其成为具有隐式展开的可选。认为您可能不得不将其向下转换为 NSData。使用内联向下转换“as?”并在使用前分配给局部变量。
        猜你喜欢
        • 1970-01-01
        • 2015-07-22
        • 2011-07-31
        • 2018-11-30
        • 1970-01-01
        • 2012-07-08
        • 2012-12-26
        • 2023-02-10
        相关资源
        最近更新 更多