簡體   English   中英

在Swift中實現UDP“監聽器”?

[英]Implementing A UDP “Listener” In Swift?

我一直在嘗試對項目進行反向工程,以發現網絡上的Logitech Harmony Hub設備,並發布了問題,以查看是否有人可以幫助我理解UDP廣播。 答案說明我已經實現了UDP廣播的發送部分,但是還沒有實現“監聽”響應的任何功能。 那就是我努力的地方。 這是我的發送代碼;

import UIKit
import CocoaAsyncSocket

class ViewController: UIViewController, GCDAsyncUdpSocketDelegate {

var address = "255.255.255.255"
var port:UInt16 = 5224
var socket:GCDAsyncUdpSocket!
var socketReceive:GCDAsyncUdpSocket!
var error : NSError?

override func viewDidLoad() {
super.viewDidLoad()

let message = "_logitech-reverse-bonjour._tcp.local.\n61991".dataUsingEncoding(NSUTF8StringEncoding)

socket = GCDAsyncUdpSocket(delegate: self, delegateQueue: dispatch_get_main_queue())
socket.sendData(message, toHost: address, port: port, withTimeout: 1000, tag: 0)

    do {
        try socket.enableBroadcast(true)
    } catch {
        print(error)
    }

}

func udpSocket(sock: GCDAsyncUdpSocket!, didConnectToAddress address: NSData!) {
    print("didConnectToAddress");
}

func udpSocket(sock: GCDAsyncUdpSocket!, didNotConnect error: NSError!) {
    print("didNotConnect \(error)")
}

func udpSocket(sock: GCDAsyncUdpSocket!, didSendDataWithTag tag: Int) {
    print("didSendDataWithTag")
} 

func udpSocket(sock: GCDAsyncUdpSocket!, didNotSendDataWithTag tag: Int, dueToError error: NSError!) {
    print("didNotSendDataWithTag")
}

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

var host: NSString?
var port1: UInt16 = 0
GCDAsyncUdpSocket.getHost(&host, port: &port1, fromAddress: address)
print("From \(host!)")

let gotdata: NSString = NSString(data: data!, encoding: NSUTF8StringEncoding)!
print(gotdata)

    }

}

我看到我有處理響應的代碼(在didReceiveData ),但是我不確定我需要實現什么才能使監聽繼續。

  • 我是否需要“綁定”到偵聽器端口(在這種情況下為61991)?
  • 我需要“加入多播組”嗎? 如果是這樣,在什么地址? 我嘗試在“ 255.255.255.255”處執行此操作,這在我構建時會產生setSocketOpt()錯誤。
  • 我知道我需要調用beginReceiving() ,並且可以在socket上完成所有這些操作,還是需要實例化一個單獨的socket進行監聽?

編輯:已解決

以下答案絕對可以幫助我解決問題。 似乎我沒有收到響應,因為我沒有完全實現一種處理傳入響應的方法。

根據下面答案中提供的代碼,我添加了以下內容;

// Setup the other socket (used to handle the response from the Harmony hub)
    otherSocket = GCDAsyncSocket(delegate: self, delegateQueue: dispatch_get_main_queue())

    do {

        // Accept connections on port 61991
        try otherSocket.acceptOnPort(61991)

    } catch {

        // Handle any errors here
        print(error)
    }

我還將此控制器設置為GCDAsyncSocketDelegate ,這似乎可以解決問題。 我能夠在didReadData讀取響應。

以下代碼更改使我能夠接收使用netcat從Mac發送的UDP數據包,但是Harmony集線器似乎沒有發送任何內容,因此我不確定所發送的數據是否正確。

override func viewDidLoad() {
super.viewDidLoad()

let message = "_logitech-reverse-bonjour._tcp.local.\n61991".dataUsingEncoding(NSUTF8StringEncoding)

socket = GCDAsyncUdpSocket(delegate: self, delegateQueue: dispatch_get_main_queue())


    do {
        try self.socket.bindToPort(61991)
        try self.socket.beginReceiving()
        try socket.enableBroadcast(true)
        socket.sendData(message, toHost: address, port: port, withTimeout: 1000, tag: 0)
    } catch {
        print(error)
    }

}

在命令行中,您可以使用以下命令測試接收

echo -n "hello" | nc -4u -w1 x.x.x.x 61991

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM