2014-09-13 52 views
1

我在基於Swift的iOS應用程序中使用CocoaAsyncSocket庫。我爲我的網絡上的UDP服務器創建了一個異步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()函數中找到了這個IP地址。

我似乎無法找到任何幫助函數來提取UDP服務器接收到的實際數據。我知道UDP回覆的ASCII表示是「你好」。但是,如果我將其更改爲其他內容,則不會反映在我在Xcode調試部分中看到的數據中。它總是wþÀ¨r

我試過NSASCIIStringEncodingNSUTF8StringEncoding,但後者導致EXC_BAD_ACCESS運行時異常。

至於我能找到,這就是人們通常如何做到這一點在Objective-C(在didReceiveData函數內):

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

如何找到在UDP答覆「你好」消息作爲字符串表示?

回答

0

這是相當愚蠢的,但刪除!didReceiveData data: NSData!部分udpSocket函數解決了這個問題。

即,功能應該被定義如下:

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

該!使它成爲一個可選的隱式解包。想想你可能不得不將它下載到NSData。使用內聯向下鑄造「as?」並在使用前分配給本地變量。 – casillic 2014-09-20 03:27:37

1

很有可能,郵件的格式根本不是您的想法,或者您發送的數據是錯誤的。爲什麼你認爲數據包的有效載荷完全是「你好」,沒有額外的(應用層)頭文件?您是否觀看了使用Wireshark或tcpdump進行驗證的網絡連接?

事實上,第一個字節正好是消息的長度(16字節),並且您指出字節3-7是IP地址,我強烈懷疑您的消息具有某種標題,這就是你在這裏看什麼。

2

您分配的地址給數據變量中的第一行,從而覆蓋在數據中的值。

let data = address 

我複製了你的代碼,嘗試別的東西,注意到了錯誤。