IOS empfängt Datenüberschreitung CFsocket

8

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)

    
tspentzas 23.11.2012, 09:23
quelle

1 Antwort

1

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:

  1. Wenn Sie CFSocketSendData zum ersten Mal aufrufen, fügen Sie auch CFRunLoopTimer hinzu.
  2. Wenn Sie einen kCFSocketDataCallBack -Rückruf erhalten, brechen Sie den Timer ab
  3. Wenn Sie niemals eine Antwort erhalten oder die Antwort wirklich spät eintrifft, wird Ihr Timer ausgelöst. Sie können das Paket einfach erneut vom Time-Timer-Callback senden und erneut mit 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.

    
Stefan Arentz 22.10.2013 00:49
quelle

Tags und Links