Я пытаюсь заставить сервер UDP функционировать в Network.framework. Однако всякий раз, когда мне удавалось подключить мой клиент и сервер, через некоторое время я получаю сообщение об ошибке nw_read_request_get_maximum_datagram_count
Я пробовал зацикливаться с таймером и с DispatchQueue, но в итоге сервер или клиент аварийно завершает работу с вышеуказанной ошибкой.
Клиент
import Foundation
import Network
class ExampleClient {
lazy var connection: NWConnection = {
let connection = NWConnection(
to: .service(
name: "Emma’s MacBook Pro",
type: "_test._udp",
domain: "local",
interface: nil
),
using: .udp
)
connection.stateUpdateHandler = { (newState) in
switch newState {
case .ready:
self.loopForever()
case .failed(let error):
print("client failed with error: \(error)")
default:
break
}
}
return connection
}()
func run() {
connection.start(queue: DispatchQueue(label: "client"))
}
func loopForever() {
while true {
connection.send(content: "hello".data(using: .utf8), completion: .contentProcessed({ (error) in
if let error = error {
print("error while sending hello: \(error)")
}
self.connection.receiveMessage { (data, context, isComplete, error) in
return
}
}))
}
}
}
let client = ExampleClient()
client.run()
RunLoop.main.run()
Сервер
import Foundation
import Network
class ExampleServer {
var connections = [NWConnection]()
lazy var listener: NWListener = {
let listener = try! NWListener(using: .udp)
listener.service = NWListener.Service(type: "_test._udp")
listener.serviceRegistrationUpdateHandler = { (serviceChange) in
switch serviceChange {
case .add(let endpoint):
switch endpoint {
case let .service(name, _, _, _):
print("listening as name \(name)")
default:
break
}
default:
break
}
}
listener.newConnectionHandler = { (newConnection) in
newConnection.start(queue: DispatchQueue(label: "new client"))
self.connections.append(newConnection)
}
return listener
}()
func run() {
self.listener.start(queue: DispatchQueue(label: "server"))
while true {
for connection in self.connections {
connection.receiveMessage { (message, context, isComplete, error) in
connection.send(content: "world".data(using: .utf8), completion: .contentProcessed({ (error) in
if let error = error {
print("error while sending data: \(error)")
}
}))
}
}
}
}
}
let server = ExampleServer()
server.run()
RunLoop.main.run()
Я бы хотел поддерживать постоянное соединение между сервером и клиентом до тех пор, пока клиент или сервер не отключатся вручную.