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 バイトは IP アドレスで、関数から既に取得していgetHost()ます。

UDP サーバーが受信した実際のデータを抽出するためのヘルパー関数が見つからないようです。UDP 応答の ASCII 表現が「hello」であることはわかっています。しかし、これを別のものに変更すると、Xcode のデバッグ部分に表示されるデータには反映されません。いつも ですwþÀ¨r

NSASCIIStringEncodingとの両方を試しまし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

おそらく、メッセージの形式があなたが思っているものではないか、間違ったデータを送信している可能性があります。パケットのペイロードが追加の (アプリケーション層) ヘッダーなしで正確に「hello」であると考えるのはなぜですか? 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 に答える