Реализация UDP «Слушатель» в 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 , или мне нужно создать экземпляр отдельного сокета для прослушивания?

Изменить: Решено

Ответ ниже помог мне решить проблему. Кажется, я не получал ответа, потому что я не полностью реализовал средства обработки входящего ответа.

На код, указанный в ответе ниже, я добавил следующее:

 // 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 .

Следующие изменения кода позволили мне получать UDP-пакеты, которые я отправил с моего Mac, используя netcat, но мой концентратор 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 xxxx 61991 
  • GCDAsyncUdpSocket не компилируется для iOS
  • Прореживание отверстий UDP на iOS
  • Невозможно установить свойство «socket» элемента gstreamer udpsink в iOS
  • Как получить пакет UPD, когда приложение находится в фоновом режиме
  • Давайте будем гением компьютера.