C++ Server: Wie kann ich von einem Server (TCP/UDP) Daten an den Client senden?



  • Hallo,
    Ich möchte gerne einen Server programmieren, der eine Spiel über Internet (kein LAN, sondern WAN) leiten soll. Ich brauche dafür jetzt so etwas wie einen Chat, mit dem Client und Server kommunizieren können. Ich habe an eine TCP/UDP-Verbindung gedacht.
    Der Client soll dabei möglichst keine Server Komponenten enthalten. Wie kann ich also über die Server Komponenten beim Server Programm Daten an den Client senden?
    Außerdem wäre es toll, wenn jemand wüsste, wie man bei einer aktiven Verbindung die IP des Gegenübers herausfinden kann, damit der Server die Verbindung nicht halten muss, sondern später wider öffnen kann.
    Hat jemand Ahnung, und ist bereit zu helfen? Im Netz habe ich leider nichts gefunden, wie der Server etwas senden kann, ich kann aber auch nicht sonderlich viel Englisch.
    TNT2k





  • Die Seite kann ich nicht aufrufen:
    The service is not available. Please try again later.

    Früher in C++ (also vor ein paar Jahren) ging das mal einfacher, Der Server konnte die Verbindung einfach halten, und man konnte die IP Adresse des Anderen einfach auslesen.



  • TNT2k schrieb:

    Die Seite kann ich nicht aufrufen:
    The service is not available. Please try again later.

    Soll ich es dir ausdrucken?

    Früher in C++ (also vor ein paar Jahren) ging das mal einfacher, Der Server konnte die Verbindung einfach halten, und man konnte die IP Adresse des Anderen einfach auslesen.

    Sicher





  • Was denn: TCP oder UDP. Bei UDP passt das Wort "Verbindung" auch nicht, da es sich eben um ein verbindungsloses Protokoll handelt.

    Kleiner Tipp, alles was vor ein paar Jahren in C++ ging, geht auch immer noch.

    Wenn du auf Lowleverl C-Style keine Luste hast, solltest du dir eine Bibliothek suchen, die das ganze kapselt oder vlt. auf eine Skriptsprache wechseln. Wenn ich mich richtig erinnere, ging das Netzwerkzeugs mit Python recht gut.

    Falls es doch C++ sein soll, gibt es hier ein paar Beispiele wie man sowas mit QT lösen kann: http://doc.qt.io/qt-5/examples-network.html
    Aber Achtung, dass ist auf Englisch. Und wenn du nur ein bisschen Netzwerkkommunikation brauchst ist QT wahrscheinlich ein ziemlicher overhead.



  • Ein Server muss, damit er funktioniert, von außen erreichbar sein.
    Ein Client kann sich hinter Firewall und Router verstecken, da er ja die Verbindung aufbaut.



  • Das SFML-Network Modul ist ebenfalls eine Möglichkeit.



  • Ich habe leider vergessen zu sagen, dass ich mich damit vorher nicht auseinandergesetzt habe, und versuche, das über die Indy Komponenten vom C++ Builder umzusetzen. Deshalb habe ich auch bisher nichts mit euren Vorschlägen anfangen können. Ich habe es inzwischen geschafft, beim TCP Server eine eingehende IP herauszufinden. Wie schaffe ich es aber, dass der Server sich erneut von sich aus mit dieser IP zum Client zu verwenden, und dann eine Nachriccht zu senden?
    IP-Adresse herausfinden:

    void __fastcall TForm1::Server1Execute(TIdContext *AContext)
    {
      String Test = AContext->Binding->PeerIP; //IP des Gegenüber zum Weiterverwenden
    }
    

    Hat jemand eine Idee, wie man diese Fragen lösen könnte?
    Vielen Dank für alle bisherige und zukünftige Hilfe



  • Schon über upnp nachgedacht ?



  • TNT2k schrieb:

    Wie schaffe ich es aber, dass der Server sich erneut von sich aus mit dieser IP zum Client zu verwenden, und dann eine Nachriccht zu senden?

    Gar nicht. Also nicht zuverlässig. Der Client muss nicht unter der IP erreichbar sein, die der Server sieht, wenn der Client von sich aus die Verbindung aufbaut. Eben weil Router, Firewall etc. Bzw. der Client könnte zu dem Zeitpunkt auch schon eine ander IP haben.
    Lösung: Verbindung aufrecht erhalten, und der Server schickt die Nachricht über die bestehende Verbindung.

    Innerhalb vom lokalen Netz funktioniert es natürlich schon, bzw. wenn man sonst wie dafür sorgt dass der Client auch garantiert erreichbar ist. Dazu muss der Client dann aber gleichzeitig auch Server sein, und der Server gleichzeitig auch Client.

    Die Standardlösung wäre aber eben die Verbindung aufrecht zu erhalten und der Server schickt über diese Verbindung. Bzw. wenn die Verbindung abreisst muss der Client eben automatisch eine neue aufbauen. Und damit man mitbekommt wann die Verbindung abgerissen ist, muss man alle paar Sekunden~Minuten eine Test-Nachrichten hin und her schicken. Wenn dann zu lange keine Test-Nachricht mehr empfangen wird, bzw. die Antwort auf die Test-Nachricht zu lange ausbleibt, dann kann man davon ausgehen dass die Verbindung nicht mehr funktioniert. Dann macht man sie zu und eine neue auf.



  • Ja, habe ich, da es aber über Internet funktionieren soll, ist das laut Wikipedia nicht geeignet.
    Schaut euch mal das an, wie komme ich an diese Datei? Ich habe leider die falsche Version, da ich schon 17.0 habe. Vielleicht funktioniert es mit der Datei trotzdem, wenn ich sie hätte.
    http://wiltonsoftware.com/posts/view/tclientsocket-and-tserversocket-missing-from-xe8


Log in to reply