4 Stimmen

Was sind einige mögliche Ursachen dafür, dass das iPhone ein UDP-Paket ablehnt?

Auf dem iPhone führe ich eine Anwendung mit der AsyncUdpSocket-Bibliothek aus, um die UDP-Vernetzung zu verwalten. Ich habe es getestet. Ich kann UDP-Pakete von meinem iPhone an einen Server senden, auf dem ein Java-Programm läuft, das UDP korrekt akzeptiert.

Wenn es jedoch andersherum ist, kommt die UDP-Nachricht des Java-Programms nicht zum iPhone durch. Also beschloss ich, die Bibliothek zu testen, ob sie ihre eigenen UDP-Pakete senden/empfangen kann oder nicht, indem sie 127.0.0.1 auf dem iPhone verwendet, und das Ergebnis ist, dass es funktioniert.

Ich habe mich gefragt, ob die UDP-Pakete gesendet werden oder nicht, also habe ich Wireshark benutzt, um meine Netzwerkaktivitäten zu sehen.

alt text

Direktlink zum Bild oben: http://img46.imageshack.us/img46/7939/screenshot20100220at110.png

Im iPhone-Programm weise ich mein UDP-Programm an, eine Verbindung zu 192.168.99.11, also zu meinem MacBook, über Port 55555 herzustellen. Dem Java-UDP-Programm auf meinem MacBook wird mitgeteilt, dass die Remote-IP, zu der eine Verbindung hergestellt werden soll, 192.168.99.13 (mein iPhone) an Port 55555 ist.

Auf Wireshark kann ich sehen, dass ICMP mir mitteilt, dass das Ziel und der Port vom iPhone aus nicht erreichbar sind.

Weiß jemand, warum das iPhone UDP-Pakete blockiert? Oder gibt es etwas, das ich übersehe?

2voto

Nikolai Fetissov Punkte 79627

Wenn ich Ihre Frage richtig verstanden habe, haben Sie zwei Client-Anwendungen. Beide versuchen, sich mit Port 55555 auf dem anderen Host zu verbinden. Ich habe keine Ahnung, wie es bei Ihnen auf einer einzelnen Box funktioniert.

Lassen Sie mich das normale Client-Server-Szenario (auch bekannt als aktiv/passiv) beschreiben:

  1. Server erstellt UDP-Socket und bind(2) s auf einen bekannten Port (55555 in Ihrem Beispiel),
  2. Serveraufrufe recv(2) -Familienfunktion auf dem Socket, um Daten von Clients zu akzeptieren,
  3. Client erstellt UDP-Socket und ruft sendto(2) Funktion mit dem Argument der Zieladresse, die mit der IP-Adresse des Servers und der bekannten Portnummer initialisiert wird.
  4. Server kehrt vom recv(2) mit den Daten des Kunden,
  5. optional tauschen Client und Server weitere Nachrichten aus.

Der Schlüssel ist, dass Sie einen bekannten Port auf der Serverseite benötigen. Der Server hingegen muss die Adresse und den Port des Clients nicht kennen, so dass der Server passiv und der/die Client(s) aktiv ist/sind. Ich sollte vielleicht noch hinzufügen, dass es nicht ungewöhnlich ist, dass UDP-Anwendungen gleichzeitig als Client und Server fungieren. Es ist nur logisch, dass dies getrennte Rollen sind.

Wenn das geklärt ist, kann es mehrere Gründe geben, warum Sie die Antwort "ICMP port unreachable" erhalten:

  • Auf dem Server-Rechner ist kein Prozess an den Port gebunden (siehe Punkt 1. oben),
  • Eine Firewall auf dem Server-Rechner lehnt aktiv Pakete ab, die an diesen Anschluss gesendet werden.

Ich hoffe, das klärt die Sache ein wenig. Lassen Sie mich wissen, wenn ich grob missverstanden, was Sie fragen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X