Ich möchte eine Verbindung mit pool.ntp.org herstellen, um die Zeit zu synchronisieren. Also erstelle einen Socket
%Vor%Dann richte ich eine Schleife ein
%Vor%und Verbinden mit der Adresse
%Vor%Wenn ich callback kCFSocketWriteCallBack habe, sende ich die erforderlichen Daten
%Vor%alles bis hier funktioniert perfekt.Mein aktuelles Problem ist
%Vor% 9/10 mal funktioniert ok. Server sendet die Antwort und mein Prozess wird fortgesetzt. Das Problem ist, dass ich darauf warte, dass die Daten meine App-Logik fortsetzen. wenn keine Daten kommen kCFSocketDataCallBack
wird nicht ausgelöst und App wartet auf immer. Gibt es eine Möglichkeit für mich, eine Zeitüberschreitung beim Warten auf den Empfang von Daten zu setzen (ohne dass ich ein NSTimer
habe, um mich wieder mit dem Pool zu verbinden)
Ich denke, es ist wichtig zu wissen, dass UDP von Natur aus unzuverlässig ist.
Es ist daher absolut möglich und normal, dass Pakete verloren gehen und Sie manchmal keine Antwort bekommen. Sie erwähnen 9 von 10 Mal, dass es funktioniert, das klingt ziemlich gut für ein UDP-basiertes Protokoll.
Ich denke also, dass Sie Ihren Code wirklich etwas schlauer machen müssen. Ich denke auch, dass es keinen Weg gibt, einen Timer zu verwenden, um herauszufinden, ob Sie tatsächlich innerhalb einer bestimmten Zeit eine Antwort erhalten haben.
Glücklicherweise ist es sehr einfach, einen CFRunLoopTimer
in Ihrer Schleife zu planen. Was Sie tun müssen, ist dies:
CFSocketSendData
zum ersten Mal aufrufen, fügen Sie auch CFRunLoopTimer
hinzu. kCFSocketDataCallBack
-Rückruf erhalten, brechen Sie den Timer ab CFRunLoopTimerSetNextFireDate
einplanen
Sie können einen Zähler beibehalten, den Sie jedes Mal erhöhen, wenn Sie ein Paket senden. Dann kannst du nach einer bestimmten Anzahl von Versuchen aufgeben.
Dies ist ein wenig mehr Code, aber es wird Ihre UDP-basierte App viel zuverlässiger machen.