UDP-Profi gesucht

  • Hallo.

    Ich habe Folgendes Problem Beziehungsweise Frage:

    WIE kann ich Per UDP Daten nichtnur Senden, sondern auch Empfangen?

    Okay etwas ausführlicher erklärt:

    Nehmen wir mal an, ich habe einen Server und einen Client (die sich übers INTERNET verbinden soll).
    Der Server Hört nun auf Port 1. Der Client Connected und sendet Etwas. Da aber keine Richtige Verbindung besteht, kann der Server nichts zurücksenden, sondern muss selbst noch eine Connection zum Client öffnen.
    Der Client hört also nachdem er gesendet hat auf Port 2, und der server verbindet sich mit der IP vom Client und dem Port2 zum Client.
    Und genau DORT ist das Problem. Da Man natürlich nicht verlangen kann, Port-Forwarding im Router einzustellen, wird das nicht klappen. Daher würde ich gerne mal wissen, wie es die Großen Spiele machen.
    Muss der Client nun _auch_ auf Port 1 hören, und der Server Connected auf Port 1 beim Clienten, damit der Router weiß, wo das Packet hingehört, oder welche Möglichkeiten gibt es da?

    Ich hoffe ihr habt verstanden was ich meine

  • So wie ich es eben nochmal bei wikipedia überflogen habe beinhaltet ein UDP Paket optional einen Quellport (falls Antworten erwünscht sind) und einen Zielport.

    Bedeutet:
    Server hört an PC1 an Port 1 (das ist der Quellport des Servers).
    Client an PC2 stellt Verbindung zu Server her und verwendet dabei als Client-Quellport z.B. Port 2 (oder einen x-beliebigen), als Zielport muss Port 1 (der Quellport des Servers) verwendet werden.
    Server empfängt Paket und antwortet mit Quellport 1 an ZielIP : Port2
    Client verwendet für nächste Antwort dann wieder den empfangenen Quellport als Zielport usw...

    Mit Portforwarding im Router hat das eigentlich recht wenig zu tun, denn in erster Linie sind die Ports dafür da damit der Empfänger PC die Pakete dem richtigen Programm zuordnen kann.
    Wenn ein Router eingesetzt wird und mehrere potentielle Empfänger PC's vorhanden sind muss allerdings wie bereits erwähnt auch eine Entscheidung getroffen werden welche Pakete an welchen PC weitergeleitet werden. Dies ist Aufgabe des Routers bzw. des Benutzers. Normalerweise verfügen aktuelle Router und Programme über eine UPnP Schnittstelle, die es dem Client oder auch Server Programm ermöglicht selbsständig eine Portweiterleitung im Router einzurichten. Wenn du also vom Benutzer nicht verlangen willst, dass er dies selbst tut solltest du deinem Programm eine UPnP Funktion verpassen. Aber dabei sollte bedacht werden, dass einige Router UPnP nicht unterstützen oder diese Funktion aus Sicherheitsgründen deaktivierbar ist. Also selbst mit dieser Funktion kannst du nicht garantieren, dass deine Anwendung ohne manuelle Eingriffe des Benutzers im Router korrekt funktioniert.

  • Zitat

    Da Man natürlich nicht verlangen kann, Port-Forwarding im Router einzustellen, wird das nicht klappen


    Bei jedem sicher nicht. Der Server muss am Router die Pakete durchlassen und an den passenden Rechner weiterleiten (port forwarding), die Clients brauchen das nicht.
    Du machst ja auch nicht Port 80 auf um Surfen zu können, im übertragenen Sinne. Der Client bekommt ja nur ne Antwort auf seine Frage.

    Gruß Dietmar

    Achtung Anfänger! :whistling:

    Betrachten des Quellcodes auf eigene Gefahr, bei Übelkeit,Erbrechen,Kopfschmerzen übernehme ich keine Haftung. 8o

  • Ja genau das ist die Frage.
    Per UDP GIBT es sowas wie ne Antwort nicht.
    Zumindest wüste ich nicht, wie ich antworten soll.
    denn es gibt ein "UDPBind", aber keine Funktion die ne richtige verbindung annimmt, sondern es wird einfach drauf los empfangen.
    und ich kann ja nicht per UDPSend an den Bind senden.

  • Nein, dass kein chat sonder ein spiel werden für viele spieler und das spiel kann zum server senden aber der server nicht zum spiel, weil wenn man eine 2. Verbindung erstellt, dann müssen auch die ports beim clienten offen sein und das ist nicht gut so.

  • TCP is zu langsam


    Da hast du zwar recht aber:


    Zitat von http://leechuck.de/voip/node12.html

    Das TCP-Protokoll ist ein ist ein zuverlässiges, verbindungsorientiertes Protokoll. Zuverlässig bedeutet, es überträgt den Bytestrom fehlerfrei vom Sender zum Empfänger. Die darunter liegende Schicht, die Internetschicht, abreitet nicht zuverlässig, also muss das TCP-Protokoll geeignete Fehlererkennungs- und Korrekturmechanismen anwenden. Dabei wird der zu übertragende Bytestrom in einzelne Nachrichten, die so genannten Segmente, zerlegt und mit einem Header versehen. Die Segmente werden dann an die Internetschicht weitergeleitet und von der Netzzugangsschicht übertragen. Die Transportschicht des Zielhosts verbindet die Segmente wieder zu einem zusammenhängenden Ausgabestrom. Der Zielhost sendet für jedes empfangene Segment eine Bestätigung. Im Falle eines zerstörten Segments wird ein entsprechender Fehlercode an den Quellhost gesendet und dieser muss das fehlerhafte Segment erneut übertragen. Außerdem reguliert TCP den Datenstrom, damit ein langsamer Empfänger nicht mit zu vielen Nachrichten überschwemmt wird.

    Zitat

    Das UDP-Protokoll ist ein unzuverlässiges, verbindungsloses Protokoll. D.h. es wird keine Verbindung aufgebaut und der Empfänger sendet keine Bestätigung über dem Empfang der Daten. Der Vorteil von UDP liegt in einer schnellen Übertragung mit geringem Verwaltungsaufwand. UDP wird vor allem bei einfachen Anfrage/Antwort-Protokollen und bei Anwendungen mit eigenen Fehlerkorrekturmechanismen verwendet. UDP findet auch Anwendung, falls die Geschwindigkeit der Übertragung wichtiger als eine fehlerfreie Zustellung ist.

  • Die Frage war nun aber nicht ob ich UDP nutzen sollte.
    Ich weiß welche Nachteile UDP hat, und in meinem Fall ist tatsächlich die Geschwindigkeit wichtiger als das Fehlerfreie übertragen von Daten.