Probleme mit 39dll

  • GM 8

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

  • Probleme mit 39dll

    Hallo Community,
    Ich habe zwei Probleme mit der 39dll.
    Mein Spiel ist von der Verbindung her genau so wie in diesem Tutorial ; nur das man die IP Adresse nicht selber eingibt, sondern diese von einem Server abgerufen wird.
    Problem nr. 1:
    Bei diesem Code werd ich immer rausgeworfen, auch wenn die Verbindung eingentlich geklappt hat.

    GML-Quellcode

    1. var size;while(true)
    2. {
    3. size = receivemessage(global.otherplayer);
    4. if(size < 0) break;
    5. if(size == 0)
    6. {
    7. show_message("Dein Mitspieler hat das Spiel verlassen!");
    8. game_end();
    9. exit;
    10. }
    11. messageid = readbyte();
    12. switch(messageid)
    13. {
    14. case 0:
    15. newx = readshort()
    16. obj_gegner.x = newx
    17. break;
    18. case 1:
    19. global.gegnername = readstring()
    20. break;
    21. } };
    Alles anzeigen


    Zeile 6 ergibt True, auch wenn ich mich erfolgreich verbunden habe. (wenn ich den Code auskommentiere, klappt alles wunderbar)

    Da das also nicht funktioniert (beim Chat_example geht es bei mir, obwohl ich eigentlich keinen Unterschied gemacht habe.)
    sende ich am Ende des Spiel eine Nachricht an den Mitspieler, das ich das Spiel verlasse. Wenn ich jetzt den Hoster schließe geht es, andersrum nicht.

    Wenn jemand eine ähnliche Erfahrung gemacht hat, kann er mir ja vielleicht helfen - hoffentlich sind es nur lichtsinnsfehler, wobei ich keine Ahnung habe, welche das sein könnten ?( .

    Vielen Dank für jede Hilfe.
  • Ich würde lieber mal den code sehen, der die Verbindung aufbaut.
    Weil der Code, den du geschickt hast, sorgt nur dafür, dass Nachrichten verarbeitet werden.
    Ansonsten, ohne code, kann ich dir leider ned helfen.

    - Tobi97
  • Das ist halt der Code, der den Fehler hervorruft.

    Die Datei möchte ich nicht so gerne posten, da sie sich schon sehr im Endstadium befindet.
    Der Fehler taucht auf, seit ich einen Sound intigriert habe, ich hab aber keinen Plan, was ich sonst noch geändert habe.




    Create-Button: (Mittelteil damit der Server die IP - Adresse Speichert)
    Spoiler anzeigen

    GML-Quellcode

    1. obj_controller.Name = get_string("Nickname","Zufall");
    2. req = http_request_create();
    3. http_request_set_url(req,"http://chaoscreator.bplaced.net/Test/IPset.php");
    4. http_request_add_post_string(req,"name",obj_controller.Name);
    5. http_request_perform(req);
    6. http_request_wait(req);
    7. buf = http_request_get_buffer(req);
    8. http_request_destroy(req);
    9. if (buf = '0')
    10. show_message("Spieler existiert bereits");
    11. else
    12. {
    13. obj_controller.master = true;
    14. room_goto(room_warten);
    15. }
    Alles anzeigen



    Join - Button (Am Anfang wird IP - Adresse abgerufen, am Ende gelöscht)
    Spoiler anzeigen

    GML-Quellcode

    1. Name = get_string("Nickname","Zufall");
    2. req = http_request_create();
    3. http_request_set_url(req,"http://chaoscreator.bplaced.net/Test/IPget.php");
    4. http_request_add_post_string(req,"name",Name);
    5. http_request_perform(req);http_request_wait(req);
    6. IP = http_request_get_buffer(req);
    7. http_request_destroy(req);
    8. if (IP = '0')
    9. {
    10. show_message(Name + " existiert nicht!");
    11. exit;
    12. }
    13. server=tcpconnect(IP,14804,true);
    14. if(server<=0)
    15. {
    16. show_message("Verbindung gescheitert!");
    17. exit;
    18. }
    19. else
    20. {
    21. global.otherplayer=server;
    22. req = http_request_create();
    23. http_request_set_url(req,"http://chaoscreator.bplaced.net/Test/IPdelete.php");
    24. http_request_add_post_string(req,"name",Name);
    25. http_request_perform(req);
    26. http_request_wait(req);
    27. http_request_destroy(req);
    28. room_goto(room_zeichnen);
    29. }
    Alles anzeigen


    Ich seh den Fehler einfach nicht!!!
  • Angenommen dein Server läuft auf der IP 123.3.4.5 und auf dem Port 1337.
    Dann musst du, wenn du auf den Server connecten willst, auch auf die IP 123.3.4.5 und den Port 1337 connecten.
    ( Aber theoretisch müsste das stimmen, sonst würde ja keine Verbindung entstehen und der Code, den du gepostet hast, würde nie aufgeführt werden )

    - Tobi97
  • Es funktioniert ja alles richtig, nur dass die gesandte message immer die Größe null hat (was aber eigentlich nicht stimmen kann...) und es Fehler mit der übertragung im Game - End Event gibt. Aber mir fällt gerade auf, dass dieser Fehler seit heute besteht, und ich heute morgen GM 8.1 geupdated habe... Ich versuchs mal auf dem 8.0er. (Die Fehler machen auch nicht wirklich sinn)

    PS: Ich spiele nicht über den Server, sondern er speichert nur meine IP adresse und nen Namen, dass man sich bequemer verbinden kann und nicht die Adresse austauschen muss.
    Wenns beim GM 8.0er Probleme gibt, melde ich mich, natürlich kann auch jeder hier weitere Ratschläge posten. Danke für die Ratschläge!
  • Was ich schon festgestellt habe ist, dass GameMaker manchmal Objekte 2mal ausfuehrt hintereinander. Das passiert nur, wenn ich ein spezielles Objekt habe, was einen initialen Event ausfuehrt, ohne das irgendein anderes Objekt etwas abfeuern konnte.

    So passiert mir bei dem 39dll Handshaking-Vorgang, dass es zweimal ausgefuehrt wird, und der Server zwei Clienten mit der selben adresse faehrt. Das eigentliche Problem dabei ist, dass "ein" Paket zu "zwei" identischen Adressen gesendet wird. Das Paket verliert seinen Inhalt nachdem der Buffer-Befehl zum entleeren aufruft, und der zweite Client dann die leere Kopie empfaengt, welches in diesem Falle die selbe Person is, die hinterm Rechner sitzt von Client 1. Also, kurz, GM Client logged zweimal ein, und der Server schickt nur ein Paket zu zwei bestehenden Verbindungen, der Client empfaengt 2 kopien, die erste hat den Inhalt , und die zweite hat NULL.

    Meine persoenliche Loesung, war eine global.variable im Room script, die einen positiven Wert bekommt, nachdem der Client einmal einlogged. Und wenn GM dann wieder diesen Scherz mit Doppelausfuehren bringt, weis die global Variable, dass es schonmal passiert ist. Und mit der if-Konstruktion, kannste dass dann im Eselsverfahren sicher machen, dass eine Funktion nicht doppelt-gemoppelt wird.

    Ich weiss nicht inwiefern das helfen koennte, aber ich dachte die einfach mal rauszuplaudern. Jeder Ratschlag traegt zur "Ne, kenn ich schon, passiert mir nich"-Liste bei, zumindest.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Gleich knallt's ()

  • Ich freu mich natürlich über jeden, der mir helfen will, aber dennoch wird es immer Rätselhafter:
    Ich habe das Spiel in den GM 8.0 übertragen, mit dem Erfolg, das er abstürzt, sobald Daten überträgt. Wenn sich deine Antwort auf den GM 8.0er bezieht, haben sie das anscheinend inzwischen gelöst.
    Das seltsame an der Variablen size: Die empfangene Nachricht hat immer die Größe -10035, wenn ein Spieler beendet -10053. Aber eigentlich wurde doch bei < 0 nichts übertragen, bei = 0 ist der Spieler offline, und bei > 0 entspricht das der Größe der Message.

    Also gibt es jetzt - wenn ich das richtig verstanden habe - die Wahl zwischen: GM 8.0 mit doppelt ausgeführten Objekten, und dem GM 8.1 mit Fehlern bei der 39dll.
    Da es beim 8.0er überhaupt nicht ging, werde ich es wahrscheinlich mit dem 8.1er neu schreiben um zu sehen, ab wann es genau nicht mehr geht.
  • Das seltsame an der Variablen size: Die empfangene Nachricht hat immer die Größe -10035, wenn ein Spieler beendet -10053. Aber eigentlich wurde doch bei < 0 nichts übertragen, bei = 0 ist der Spieler offline, und bei > 0 entspricht das der Größe der Message.
    Die 39dll handelt die Rückgabewerte von den Winsock Funktionen so:
    >0 Winsock Error; wird -ErrorNummer zurück geben.
    =0 Ein bestimmter Winsock Error der dann einfach als 0 zurück geben wird.
    Dann liest die 39dll wenn alles glatt läuft die Größe aus (ist ein Short an jeder Nachricht).

    Im Klartext gibt dir die Funktion receivemessage 3 verschiedene Typen Rückgabewerte zurück:
    • 0 für einen bestimmten Winsock Error der bedeutet das die Verbindung unterbrochen wurde
    • <0 für einen Winsock Error
    • >0 Größe des Packets (ein Short am Anfang der Nachricht, für spätere Verwendung in anderen Programmiersprache/ohne 39dll wichtig)

    10053 ist support.ipswitch.com/kb/WSK-19980702-EM02.htm .

    #edit: Btw wäre noch Interessant den Listener-Code/Server/Hoster zu sehen.
    wupto.net/ Nicht meine Seite!
    We love Koalas.

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

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

  • Ich mache das Spiel gerade mit dem GM 8.0 neu und habe einen seltsamen Fehler entdeckt. Er hat aber leider nichts mit den seltsamen Symptomen zu tun, sondern spielt auf Server Ebene:

    Der Code

    PHP-Quellcode

    1. <?php
    2. $var = $_POST['test'];
    3. echo $var;
    4. ?>
    gibt nichts zurück. Wo ist der Fehler?

    EDIT: Mit GET geht's, aber warum nicht mit POST? Gestern hat es mit POST noch funktioniert... ?(

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Chaos Creator ()

  • Jetzt klappt alles, ich dachte zwar das die anfrage per URL + POST mal geklappt hätte, da hab ich mich aber offensichtlich getäuscht. Im Spiel funktioniert es - macht PHP einen unterschied zwischen 'abc' und "abc"? Das habe ich geändert und seit dem geht es.
    Vielen Dank an alle, die mir geholfen haben. Wenn ich weitere Fragen habe, schreibe ich sie einfach hier rein :)