NWConnection SSDP Discovery не получает данные

Я пытаюсь выполнить широковещательную рассылку SSDP Discovery и не могу получить ответные данные от NWConnection.receive.

Network.framework является относительно новым, и о нем не так много информации. Что мне здесь не хватает?

Широковещательная рассылка SSDP Discovery была отправлена, и устройство UPnP ответило. (Снимок экрана Wireshark ниже) введите здесь описание изображения

    import Foundation
    import Network

    let connection = NWConnection(host: "239.255.255.250", port: 1_900, using: .udp)

    func sendBroadcast() {
        let message = """
            M-SEARCH * HTTP/1.1
            ST: ssdp:all
            HOST: 239.255.255.250:1900
            MAN: ssdp:discover
            MX: 1
            """.data(using: .utf8)

        connection.send(content: message, completion: .contentProcessed { error in
                if let error = error {
                    print("Send Error: \(error)")
                } else {
                    print("Broadcast sent")
                }
            }
        )
    }

    connection.stateUpdateHandler = { newState in
        switch newState {
        case .setup:
            print("Connection: Setup")
        case .preparing:
             print("Connection: Preparing")
        case .waiting:
            print("Connection: Waiting")
        case .ready:
            print("Connection: Ready")
            sendBroadcast()
        case .failed:
            print("Connection: Failed")
        case .cancelled:
            print("Connection: Cancelled")
        }
    }

    connection.receive(minimumIncompleteLength: 2, maximumLength: 4_096) { data, context, isComplete, error in
        /// This is never executed
        ///
        print(data ?? "", context ?? "", isComplete, error ?? "")
    }

    connection.viabilityUpdateHandler = { update in
        print(update)
    }

    connection.betterPathUpdateHandler = { path in
        print(path)
    }

    connection.start(queue: .main)

    RunLoop.main.run()

person Alex    schedule 15.02.2019    source источник
comment
Спасибо за пример NWconnection, даже если этот не работает. Похоже, программирование NWconnection будет проще, чем CFnetwork, как только мы к нему привыкнем.   -  person Darrell Root    schedule 16.02.2019


Ответы (2)


Оказывается, Network.framework еще не поддерживает рассылки UDP (февраль 2019 г.) https://forums.developer.apple.com/message/316357#316357

person Alex    schedule 15.02.2019
comment
Бета-версия iOS 14 теперь поддерживает многоадресную рассылку, которая, похоже, будет вам интересна developer.apple .com/forums/thread/104724 - person squarefrog; 16.07.2020

Вместо этого с UDP попробуйте этот метод:

connection.receiveMessage { (data, context, isComplete, error) in

    print(data ?? "", context ?? "", isComplete, error ?? "")
}

Вот хороший пример этого в используйте здесь

У меня была противоположная проблема с TCP, и я использовал connection.receiveMessage(...), и происходило то же самое - обратный вызов никогда не вводился. Я разместил вопрос на форумах Apple. Оказывается с TCP можно использовать только:

connection.receive(minimumIncompleteLength: 1, maximumLength: 65535) { data, context, isComplete, error in
    
    print(data ?? "", context ?? "", isComplete, error ?? "")
}

Специалист службы технической поддержки разработчиков Apple по имени eskimo ответил на этот вопрос здесь:

<сильный>. TCP не является протоколом, ориентированным на передачу сообщений, поэтому

receiveMessage(…)

не имеет никакого смысла. Вам нужно

receive(minimumIncompleteLength:maximumLength:completion:)

При этом с UDP попробуйте connection.receiveMessage(…)

person Lance Samaria    schedule 16.12.2020