39dll - Grundlagen

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • 39dll - Grundlagen

      Da immer wieder die Frage auftaucht "Wie funktioniert die 39dll und wie benutze ich sie?" versuche ich meine ganzen Posts in dieses Tutorial zu bringen. Dabei werde ich kein Example schreiben!

      Zuerst laden wir uns die aktuelle Version der 39dll herunter:
      gmc.yoyogames.com/index.php?showtopic=90437

      Was ist die 39dll?

      Die 39dll ist eine DLL die Funktionen unteranderem dazu gibt Daten über das Internet (TCP und UDP) zu versenden, als auch Datein zu lesen. Das Datein lesen wird hier nicht behandelt, ist aber eigentlich genau das selbe wie beim Internet.

      Die 39dll benutzt einen Buffer. Ein Buffer ist ein Zwischenspeicher indem man Daten lesen oder schreiben kann (wie eine Datei, nur eben im Arbeitsspeicher). Die Daten werden aber nicht irgendwie dort rein geschrieben sondern es gibt dazu Datentypen. Im Game Maker gibt es, wie du weissts, zwei Datentypen: reals und strings. Bei der 39dll gibt es aber noch viel mehr, wir teilen diese in Texte, Ganze Zahlen und Gleitkommazahlen auf.

      Text (Hello World): string
      Ganze Zahlen (4, -4): int, short
      Gleitkommazahlen (3.14, -3.14): float, double

      Der Unterschied in diesen ganzen Datentypen liegt darin das diese
      1. für andere Zwecke sind (Texte, Ganze Zahlen...)
      2. unterschiedliche Größen haben (int = 32 Bits, short = 16 Bits, double = 64 Bits)
      Die Größe der strings ist unterschiedlich weil der Text unterschiedlich ist. Da diese Datentypen unterschiedlich groß sind, können diese auch unterschiedliche große Zahlenräume speichern. Der Computer benutzt das Dualsystem um Zahlen darzustellen. Eine 0 oder eine 1 ist ein Bit. Eine Tabelle wie groß die Zahlen sein dürfen gibt es bei Wikipedia . (Es gibt noch unsigned Ganze Zahlen, also diese die keine negativen Zahlen mit einbeziehen)

      Die Grundlagen sind eigentlich fast da! Wie am Anfang erwähnt kennt die 39dll zwei Protokolle: TCP und UDP. TCP hat Verbindungen, UDP nicht. Dazu gibt es noch ein paar mehr Unterschiede, die ihr aber selbst rausfinden könnt.

      Für den Anfang könnt ihr einfach TCP benutzen.

      Verbindungen über TCP (siehe auch: gm-d.de/wbb/index.php/Thread/7…indung-und-kommunikation/)

      Es gibt auch verschiedene Netzwerk Arten (Peer-to-Peer oder Client-Server). Bei Peer-to-Peer ist jeder Spieler mit jeden anderen Spieler verbunden:

      Bei dem Client-Server Modell ist jeder Spieler mit einem Server verbunden:

      Und auch hier wieder benutzen wir das Client-Server Model (Beispiele: Counter-Strike, Battlefield, Minecraft...).

      Der Client ist der Spieler. Wenn der Spieler etwas in den Chat schreibt zum Beispiel, wird das zum Server gesendet und der verarbeitet die Nachricht weiter (Beleidungsfilter, Befehle usw.) und versendet diese Nachricht weiter an andere Spieler.

      Der Verbindungsaufbau ist relativ einfach:

      GML-Quellcode

      1. /**Client:**/
      2. serversocket = tcpconnect(IP, Port); //Verbindung zu dem Server versuchen aufzubauen
      3. /**Server:**/
      4. listener = tcplisten(Port, 1, true); //Der Server sucht über diesen Port nach Clients
      5. //Client-Verbindung akzeptieren
      6. clientsocket = tcpaccept(listener, true);


      Hier will ich nicht weiter ins Detail gehen ein Tutorial gibt es schon dazu.

      Der Buffer

      Es gibt immer einen Buffer (man kann aber auch mehr benutzen) indem man schreiben und lesen kann.

      Dafür gibt es die write und die read Funktionen und nun kommen die Datentypen ins Spiel. Nehmen wir an wir wollen "Hello, World!" und eine Zahl versenden:

      GML-Quellcode

      1. //Hello, World! ist ein Text, also benutzen wir einen String
      2. writestring("Hello, World!");
      3. //4 ist eine Zahl, also benutzen wir einen Datentyp für ganze Zahlen.
      4. //Wir benutzen auch hier wieder zur Einfachheit einen int (hier kann man optimieren)
      5. writeint(4);


      Nun stehen in unserem Buffer der Text und eine Zahl. Jetzt können wir das ganze versenden.

      GML-Quellcode

      1. sendmessage(serversocket);


      Hier kommt wieder unsere ID die wir von tcpconnect zurück bekommen haben ins Spiel.

      Wir sollten danach noch den Buffer leeren damit die Daten nicht wieder versendet werden:

      GML-Quellcode

      1. clearbuffer();


      Unsere Nachricht befindet sich nun auf den Weg über das Internet.

      GML-Quellcode

      1. var ret;
      2. ret = receivemessage(clientsocket); //<- ID von tcpaccept
      3. // ret ist nun entweder die Größe der gelesen Bytes, eine negative Zahl wenn keine Daten verfügbar sind oder 0 wenn der Client die Verbindung geschlossen hat
      4. if (ret>0) //wir betrachten nur den Fall das wir Daten gelesen haben
      5. {
      6. show_message(readstring()); //gibt "Hello, World!" aus
      7. show_message(string(readint())); //gibt 4 aus
      8. }


      In vielen Examplen wird immer ein Byte am Anfang versendet, der hier fehlt. Der Byte soll den Nachrichten Typ angeben, was für eine Nachricht das nun ist. Da wir nur eine Nachricht haben brauchen wir das hier nicht. Die read-Funktionen geben keine Fehlermeldungen zurück wenn man versucht eigentlich falsche Daten zu lesen (das kann dazu führen das völlig falsche Daten gelesen werden), daher ist die Reihenfolge wichtig. Schreiben wir erst den string, müssen wir auch den string am Anfang wieder auslesen.

      Unsere Nachricht sollte heil angekommen sein und wir haben unsere erste Dinge über das Internet versendet.


      Ich habe das ganze ohne Plannung geschrieben, d.h. es kann Fehler geben und die Codes sind alles nur Beispielcodes. Für Beispiele gibt es zwei Tutorials dazu:
      gm-d.de/wbb/index.php/Thread/7…indung-und-kommunikation/
      http://www.gm-d.de/wbb/index.php/Thread/12299/39dll-ein-simples-spiel/

      Die 39dll ist aber keines Wegs auf Spiele beschränkt, hier ist noch eine Tutorial das zeigt wie man IRC in den Grundlagen benutzt:
      http://www.gm-d.de/wbb/index.php/Thread/15876/39dll-irc-verbindung-und-joinen/

      Wer Fragen oder Fehler findet, bitte melden!
      wupto.net/ Nicht meine Seite!
      We love Koalas.

      GM-D-Spam-o-Meter: 32%

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von henrik1235 ()