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()
2 ответа
Оказывается, Network.framework еще не поддерживает UDP-трансляции (февраль 2019 г.) https://forums.developer.apple.com/message/316357
Вместо этого попробуйте этот метод:
connection.receiveMessage { (data, context, isComplete, error) in
print(data ?? "", context ?? "", isComplete, error ?? "")
}
Вот хороший пример его использования здесь
У меня была противоположная проблема, и я использовал
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(…)