Я пытался несколько перепроектировать проект для обнаружения устройств 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
.