1

I am trying to use GCDAsyncUdpSocket to discover DIAL devices on a network. I have successfully used Netflix's official C++ client to discover devices, as specified here, but would like to avoid using C++ or Objective-C++ classes in my Swift project. Here is my discovery class, and it reports the socket being created and opened, but nothing ever is received. Is anyone versed in DIAL enough to see where I'm going wrong?

import Foundation
import CocoaAsyncSocket

class UDPListener: NSObject {

    var udpSocket: GCDAsyncUdpSocket?

    override init() {
        super.init()
        self.udpSocket = GCDAsyncUdpSocket(delegate: self, delegateQueue: dispatch_get_main_queue())
        self.udpSocket?.setIPv6Enabled(false)
        do {
            try self.udpSocket?.enableBroadcast(true)
            print("Broadcasting enabled.")
        } catch let error as NSError {
            print(error)
        }

        let interfaces = Helper.availableNetworkInterfaces()
        let sourceAddress = interfaces!.values.first as? NSData

        do {
            try self.udpSocket?.bindToAddress(sourceAddress)
            print("Bound to \(sourceAddress!))")
        } catch let error as NSError {
            print("Error binding address: \(error)")
            return
        }

        do {
            try self.udpSocket?.joinMulticastGroup("239.255.255.250", onInterface:  "en0")
            print("Joined multicast group.")
        } catch let error as NSError {
            print("Error joining group: \(error)")
            return
        }

        do {
            try self.udpSocket?.beginReceiving()
            print("Ready to receive data.")
        } catch let error as NSError {
            print("Error on trying to receive: \(error)")
            return
        }
        print("Socket created.")
    }

    func broadcast() {
        let data = "M-SEARCH * HTTP/1.1\r\nHOST: 239.255.255.250:1900\r\nMAN: \"ssdp:discover\"\r\nMX: 3\r\nST: urn:dial-multiscreen-org:service:dial:1\r\nUSER-AGENT: iOS DIAL Client/1.0 UDPListener/1.0\r\n\r\n".dataUsingEncoding(NSUTF8StringEncoding)!
        self.udpSocket?.sendData(data, withTimeout: -1, tag: 0)
    }
}

extension UDPListener: GCDAsyncUdpSocketDelegate {

    func udpSocket(sock: GCDAsyncUdpSocket!, didReceiveData data: NSData!, fromAddress address: NSData!, withFilterContext filterContext: AnyObject!) {
        print("RECEIVED DATA: \(String(data: data, encoding: NSUTF8StringEncoding)!)\nFROM: \(Helper.constructURLsFromNSNetServiceAddresses([address])!)")
    }

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

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

    func udpSocket(sock: GCDAsyncUdpSocket!, didNotSendDataWithTag tag: Int, dueToError error: NSError!) {
        print("did not send data, error: \(error)")
    }

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

    func udpSocketDidClose(sock: GCDAsyncUdpSocket!, withError error: NSError!) {
        print("did close")
    }
}
diatrevolo
  • 2,782
  • 26
  • 45

0 Answers0