39dll übertragungfehler

  • GM 8

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

  • 39dll übertragungfehler

    hi leute. bin grad aus spaß an einem online Tic tac toe spiel dran.

    Dass Spieler sich gegenseitig die namen schicken können haut hin, nur das was relevant ist, in dem fall die übertragung welchen zug der gegner gemacht hat scheitert aber..

    Spoiler anzeigen

    GML-Quellcode

    1. if (global.master == true && global.anderreihe == "spieler1")
    2. {
    3. if ((mouse_check_button_pressed(mb_left)) && mouse_x >= x && mouse_x <= x+100)
    4. {
    5. if (mouse_y > y && mouse_y <= y+100 && global.feld[0,0] == "")
    6. {global.feld[0,0] = "spieler1"; global.anderreihe = "spieler2"; }
    7. if (mouse_y > y+101 && mouse_y <= y+200 && global.feld[0,1] == "")
    8. {global.feld[0,1] = "spieler1"; global.anderreihe = "spieler2"; }
    9. if (mouse_y > y+201 && mouse_y <= y+300 && global.feld[0,2] == "")
    10. {global.feld[0,2] = "spieler1"; global.anderreihe = "spieler2"; }
    11. }
    12. if ((mouse_check_button_pressed(mb_left)) && mouse_x > x+100 && mouse_x <= x+200)
    13. {
    14. if (mouse_y > y && mouse_y <= y+100 && global.feld[1,0] == "")
    15. {global.feld[1,0] = "spieler1"; global.anderreihe = "spieler2"; }
    16. if (mouse_y > y+101 && mouse_y <= y+200 && global.feld[1,1] == "")
    17. {global.feld[1,1] = "spieler1"; global.anderreihe = "spieler2"; }
    18. if (mouse_y > y+201 && mouse_y <= y+300 && global.feld[1,2] == "")
    19. {global.feld[1,2] = "spieler1"; global.anderreihe = "spieler2"; }
    20. }
    21. if ((mouse_check_button_pressed(mb_left)) && mouse_x > x+200 && mouse_x <= x+300)
    22. {
    23. if (mouse_y > y && mouse_y <= y+100 && global.feld[2,0] == "")
    24. {global.feld[2,0] = "spieler1"; global.anderreihe = "spieler2"; }
    25. if (mouse_y > y+101 && mouse_y <= y+200 && global.feld[2,1] == "")
    26. {global.feld[2,1] = "spieler1"; global.anderreihe = "spieler2"; }
    27. if (mouse_y > y+201 && mouse_y <= y+300 && global.feld[2,2] == "")
    28. {global.feld[2,2] = "spieler1"; global.anderreihe = "spieler2"; }
    29. }
    30. ///////////////////////////////////////////SENDEN/////////////////////////////////
    31. clearbuffer()
    32. writebyte(1)
    33. writestring(global.anderreihe)
    34. writestring(global.feld[0,0])
    35. writestring(global.feld[0,1])
    36. writestring(global.feld[0,2])
    37. writestring(global.feld[1,0])
    38. writestring(global.feld[1,1])
    39. writestring(global.feld[1,2])
    40. writestring(global.feld[2,0])
    41. writestring(global.feld[2,1])
    42. writestring(global.feld[2,2])
    43. sendmessage(global.otherplayer) ///// EDIT VORHER STAND HIER sendmessage(global.tictactoe)///
    44. ///////////////////////////////////////////SENDEN/////////////////////////////////
    45. }
    46. if (global.master == false && global.anderreihe == "spieler2")
    47. {
    48. if ((mouse_check_button_pressed(mb_left)) && mouse_x >= x && mouse_x <= x+100)
    49. {
    50. if (mouse_y > y && mouse_y <= y+100 && global.feld[0,0] == "")
    51. {global.feld[0,0] = "spieler2"; global.anderreihe = "spieler1"; }
    52. if (mouse_y > y+101 && mouse_y <= y+200 && global.feld[0,1] == "")
    53. {global.feld[0,1] = "spieler2"; global.anderreihe = "spieler1"; }
    54. if (mouse_y > y+201 && mouse_y <= y+300 && global.feld[0,2] == "")
    55. {global.feld[0,2] = "spieler2"; global.anderreihe = "spieler1"; }
    56. }
    57. if ((mouse_check_button_pressed(mb_left)) && mouse_x > x+100 && mouse_x <= x+200)
    58. {
    59. if (mouse_y > y && mouse_y <= y+100 && global.feld[1,0] == "")
    60. {global.feld[1,0] = "spieler2"; global.anderreihe = "spieler1"; }
    61. if (mouse_y > y+101 && mouse_y <= y+200 && global.feld[1,1] == "")
    62. {global.feld[1,1] = "spieler2"; global.anderreihe = "spieler1"; }
    63. if (mouse_y > y+201 && mouse_y <= y+300 && global.feld[1,2] == "")
    64. {global.feld[1,2] = "spieler2"; global.anderreihe = "spieler1"; }
    65. }
    66. if ((mouse_check_button_pressed(mb_left)) && mouse_x > x+200 && mouse_x <= x+300)
    67. {
    68. if (mouse_y > y && mouse_y <= y+100 && global.feld[2,0] == "")
    69. {global.feld[2,0] = "spieler2"; global.anderreihe = "spieler1"; }
    70. if (mouse_y > y+101 && mouse_y <= y+200 && global.feld[2,1] == "")
    71. {global.feld[2,1] = "spieler2"; global.anderreihe = "spieler1"; }
    72. if (mouse_y > y+201 && mouse_y <= y+300 && global.feld[2,2] == "")
    73. {global.feld[2,2] = "spieler2"; global.anderreihe = "spieler1"; }
    74. }
    75. clearbuffer()
    76. writebyte(1)
    77. writestring(global.anderreihe)
    78. writestring(global.feld[0,0])
    79. writestring(global.feld[0,1])
    80. writestring(global.feld[0,2])
    81. writestring(global.feld[1,0])
    82. writestring(global.feld[1,1])
    83. writestring(global.feld[1,2])
    84. writestring(global.feld[2,0])
    85. writestring(global.feld[2,1])
    86. writestring(global.feld[2,2])
    87. sendmessage(global.otherplayer)
    88. }
    89. ///////////////////////////////////////////EMPFANGEN/////////////////////////////////
    90. var size;
    91. while(true)
    92. {
    93. size = receivemessage(global.otherplayer);
    94. if(size < 0) break;
    95. if(size == 0)
    96. {
    97. show_message("Dein Mitspieler hat das Spiel verlassen!");
    98. game_end();
    99. exit;
    100. }
    101. messageid = readbyte();
    102. switch(messageid)
    103. {
    104. case 1:
    105. global.anderreihe = readstring()
    106. global.feld[0,1] = readstring()
    107. global.feld[0,2] = readstring()
    108. global.feld[1,0] = readstring()
    109. global.feld[1,1] = readstring()
    110. global.feld[1,2] = readstring()
    111. global.feld[2,0] = readstring()
    112. global.feld[2,1] = readstring()
    113. global.feld[2,2] = readstring()
    114. break;
    115. };
    116. }
    117. ///////////////////////////////////////////EMPFANGEN/////////////////////////////////
    Alles anzeigen



    das ist der ganze code vom objekt (welches 100% im raum dabei ist). ich versteh nicht warum das nicht übertragen wird es ist n string und wird auch dementsprechend behandelt.
    Das senden und empfangen hab ich "hervorgehoben". Es gibt zwar noch ein senden, welches in diesem code enthalten ist aber das ist nich wichtig...
    Das empfangen hat deshalb keine abfrage nach if master == true bzw false, weil da bei beiden der selbe code laufen würde. Habs auch mit probiert usw -> ging nicht.


    Zur info, der folgende code funktioniert (der code ist im selben spiel für den namens empfang... kann glaub ich auch eine wichtige rolle spieln beim fehler finden... sonst wird im spiel noch nichts übertragen)
    Spoiler anzeigen

    GML-Quellcode

    1. if global.master = true {
    2. if !(sp1prev == global.spieler1)
    3. {
    4. clearbuffer()
    5. writebyte(0)
    6. writestring(global.spieler1)
    7. sendmessage(global.otherplayer)
    8. sp1prev = global.spieler1
    9. }
    10. if (keyboard_check_pressed(ord("N"))) {global.spieler1 = get_string("Dein neuer Name?","Spieler1")}
    11. }
    12. if global.master = false {
    13. var size;
    14. while(true)
    15. {
    16. size = receivemessage(global.otherplayer);
    17. if(size < 0) break;
    18. if(size == 0)
    19. {
    20. show_message("Dein Mitspieler hat das Spiel verlassen!");
    21. game_end();
    22. exit;
    23. }
    24. messageid = readbyte();
    25. switch(messageid)
    26. {
    27. case 0:
    28. global.spieler1 = readstring()
    29. break;
    30. }
    31. };
    32. }
    Alles anzeigen


    ich versteh nicht was ich da so anders gemacht hab das es nicht funktioniert.
    oder muss ich zum senden und empfangen von paketen ein anderes objekt machen?
    bitte um hilfe :p


    EDIT!:

    sendmessage(global.otherplayer) ///// EDIT VORHER STAND HIER sendmessage(global.tictactoe)///
    (sieht man beim lesen)
    mfg Salmi

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

  • Also aus Erfahrung, wuerde ich dir raten deine Pakete anders zu struckturieren. Schick einen Hash anstelle mehrere Pakete.
    39DLL schickt nur jeweils eine "Data-Type" (vom gleichen Type, sendet aber mehrere unterschiedliche Types). zum Beispiel:

    GML-Quellcode

    1. //FALSCH:
    2. clearbuffer()
    3. writebyte(1) //Das wird empfangen
    4. writestring(global.anderreihe) //das NICH
    5. writestring(global.feld[0,0]) //das NICH
    6. writestring(global.feld[0,1]) // " "
    7. writestring(global.feld[0,2])
    8. writestring(global.feld[1,0])
    9. writestring(global.feld[1,1])
    10. writestring(global.feld[1,2])
    11. writestring(global.feld[2,0])
    12. writestring(global.feld[2,1])
    13. writestring(global.feld[2,2]) // Nur dieser string wird empfangen.
    14. //warum? Ganz einfach, du tust im Prinzip nichts anderes als den String Buffer (der nur ein Paket reseviert) immer wieder mit einem neuen String ersetzen.
    15. sendmessage(global.tictactoe)
    Alles anzeigen


    es muss lauten:

    GML-Quellcode

    1. clearbuffer()
    2. writebyte(1)
    3. writestring(global.anderreihe)
    4. sendmessage(global.tictactoe)
    5. clearbuffer()
    6. writebyte(1)
    7. writestring(global.feld[0,0])
    8. sendmessage(global.tictactoe)
    9. clearbuffer()
    10. writebyte(1)
    11. writestring(global.feld[0,1])
    12. sendmessage(global.tictactoe)
    13. //usw... Aber um sicher zugehen, das deine Pakete auch soschnell sicher ankommen, schreibe jeweils ein einzigartiges Byte anstelle von immer dem gleichen Byte, zum Beispiel writebyte(1) und dann writebyte(2) usw.
    Alles anzeigen


    Du kannst mehrere verschiedene DataTypes aufeinmal senden, zum Beispiel:

    GML-Quellcode

    1. clearbuffer()
    2. writebyte(1)
    3. writestring(global.feld[0,0])
    4. writeshort(848.09689)
    5. writeint(18975832)
    6. writestring('blah')
    7. writefloat(7.090843)
    8. sendmessage(global.tictactoe)
    9. //das funktioniert dann schon eher, aber reserviert halt fuer jeden Data-Type einen Platz im message buffer
  • wow danke für die antwort...
    das klingt irgendwie einleuchtend, aber bei einem anderen spiel hab ich die x und y achse auch auf einmal geschickt
    warum ging das dann?

    ich werds jedenfalls probieren!
    mfg Salmi
  • Salmi schrieb:

    ... aber bei einem anderen spiel hab ich die x und y achse auch auf einmal geschickt
    warum ging das dann?...


    hehe, das weiss ich auch nich. Wie schon gesagt, ich sprech hier wirklich nur aus "eigener" Erfahrung. :)
    So wie ich es oben beschrieben habe, hat es fuer mich stets ohne Probleme funktioniert. Weil ich bin auch schon dagesessen und hab mir ueberlegt wie es waere, wenn ich einfach mal ganzviele string schicke, und hatte dann das selbe Problem wie du. Bei naeherem hinsehen allerdings ist es auch klar, warum das nicht so funktionieren kann :P
  • hm... ja kann sein nur wenn ich jetzt überleg, es wird nicht einmal irgendwas geschickt!
    nicht das erste nicht das letzte und in der mitte auch nix...
    das heißt da muss noch wo ein problem sein o:
    mfg Salmi
  • Das ist ein Irrtum, dass man nur eines pro Type versenden kann. Man kann sehrwohl auch mehrere Strings zb versenden. Grundsätzlich sehe ich auf die schnelle jetzt keinen Fehler, zu bemänglen hätte ich allerdings, dass du die Werte alle als Strings versendest. Sollten diese Werte Zahlen sein, könnte es daran liegen. Zahlen solltest du je nach größe als bytes, shorts oder integers versenden und empfangen. Das spart dir einiges an Bandbreite, da Strings die lastigste Methode sind, Daten zu übertragen.

    © 2008 by Teamgrill Productions
  • MasterXY schrieb:

    Das ist ein Irrtum, dass man nur eines pro Type versenden kann. Man kann sehrwohl auch mehrere Strings zb versenden. Grundsätzlich sehe ich auf die schnelle jetzt keinen Fehler, zu bemänglen hätte ich allerdings, dass du die Werte alle als Strings versendest. Sollten diese Werte Zahlen sein, könnte es daran liegen. Zahlen solltest du je nach größe als bytes, shorts oder integers versenden und empfangen. Das spart dir einiges an Bandbreite, da Strings die lastigste Methode sind, Daten zu übertragen.


    Da bin ich glatt froh, dass ich mich da geirrt habe . Das ersparrt mir'n haufen Traffic zwischen Client und Server ^^
    Aber was dennoch komisch ist, ich habe das ganz am Anfang mal ausprobiert und Das, was gesendet wurde, war der zuletzt asoziierte String zur writestring() - Funktion.

    Quellcode

    1. clearbuffer();
    2. writebyte(1);
    3. writestring('Wurst'); //ist nicht angekommen
    4. writestring('Salat'); //ist angekommen
    5. sendmessage(tcpipC);


    und meine Abfrage war:

    Quellcode

    1. //while-loop-construction "message size"
    2. switch(msgid)
    3. {
    4. case 1:
    5. txt1 = readstring();
    6. txt2 = readstring();
    7. break;
    8. };
    9. //txt1+txt2 = "SalatSalat";

    ...das kommt da bei mir raus ^^ Deswegen hab ichs von da an nur noch einzeln gesendet.
  • @MasterXY...
    ja es wird mit buchstaben verschickt...
    ich änder das einfach mal weil es da nicht wichtig ist ob es per string oder zahl überliefert wird... mal schaun


    edit: naja es sind teils buchstaben teils zahl... ob das der fehler sein kann?:D mal schaun...
    mfg Salmi
  • Schicke Strings nur wenn es nicht anders möglich ist.
    Wie schon erwähnt:

    GML-Quellcode

    1. writebyte(zahl) // Für Zahlen von 0-255, 1 Byte groß.
    2. writeshort(zahl) // Für Zahlen zwischen -32512 und +32512, 2 Bytes groß.
    3. writeint(zahl) // Für Zahlen zwischen -2114125312 und +2114125312, 4 Bytes groß.
    4. writefloat(zahl) // Für Zahlen mit Kommastellen, 4 Bytes groß.
    5. writedouble(zahl) // Für alle Zahlengrößen, 8 Bytes groß.
    6. writestring(string) // Für Zeichenketten, 1 Byte + 1 BYTE PRO JEDEM BUCHSTABEN (Bei einer zum String konvertierten Zahl von 23 wären das schon 3 Bytes, ließe sich aber auch mit 1 Byte regeln)


    Du wirst dir diesbezüglich noch nicht viele Gedanken gemacht haben und das ist auch okay, wenn man mit der 39dll anfängt, aber es ist wichtig, dass man entscheidet, welche Variante man in welchem Fall benutzt. Und wie Gleich knallt's bereits angemerkt hat, kannst du die Typen in einer Message mischen und musst nicht nur Shorts zb versenden. Wichtig ist, dass du die Nachricht dann in der selben Reihenfolge ausliest, wie sie geschrieben wird (auch mit den entsprechenden Datentypen).

    EDIT: Ich habe mal eben bei meinem aktuellen Projekt getestet, wie viele Daten durchschnittlich bei 2 Spielern pro Sekunde übertragen werden und es mit meinem ältern Spiel Battle Tanks Online 2 verglichen. Auch wenn man bei meinem jetzigen Projekt immer noch was rausholen konnte zeigt der Vergleich wie wichtig es ist, zu wissen was man wann, wie und vor allem wie oft sendet. Während bei Battle Tanks Online 2 um die 3KB/s übertragen werden, sind es bei Hard Recoil 0.4KB/s und das bei zusätzlich zu übertragenden KI-Gegnern. Die Werte mögen jetzt nicht erschreckend hoch sein, aber man muss bedenken, das sind Werte bei nur 2 Spielern (Server + Client)

    © 2008 by Teamgrill Productions

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

  • hmm danke für die erklärung, kann mir vorstellen das beim übertragen bei vorallem größeren spielen das wichtig ist:D
    das speicher ich mir gleich in ne word datei :p

    wobei es immer noch nicht funktioniert...
    aber ich schau weiter! :D
    mfg Salmi
  • sorry für doppelpost aber:

    warum verdammt sagt er bei

    sendmessage(global.wasweissich)
    und
    receivermessage(global.wasweissich)

    unknown variable global.wasweissich?

    das is sowas von unlogisch bei nem andren objekt kann ich schreiben wass ich will als variable und da meckert er nie :o... (und die verbindung haut hin und dort steht das "selbe" (also alles gleich nur zb andre werte) wie bei dem wo er meckert)
    und definiern soll man das ja nicht oder?
    mfg Salmi
  • Natürlich musst du eine Variable definieren, bevor du sie verwendest. Wenn es bei einem anderen Projekt hinhaut, liegt es wahrscheinlich daran, dass "Define undefinied variables as 0" angestellt is.

    © 2008 by Teamgrill Productions
  • Dieses Argument gibt an in welchen Buffer das ganze kommt(bsw. welcher Buffer versendet werden soll), für den Default-Buffer kann man 0 verwenden bsw. das Argument ganz weglassen.
    Und @Gleich knallt's: Für was 9 verschiedene _Packets_ nur um zwei Werte mit zu senden? Der Client Du kannst auch zwei Datentypen gleichzeitig verwenden sogar mehre, das ganze kommt in einen Buffer(einen Byte-Array). Dieser wird dann mit sendmessage als Packet versendet (siehe IP/TCP).

    @Salmi: Es macht keinen Sinn immer das ganze Feld zu schicken, ein "Mache Kreuz oder Kreis"-Packet reicht da auch:

    GML-Quellcode

    1. clearbuffer();
    2. writebyte(macheKreuKOderKreisPacketId);
    3. writebyte(posx);
    4. writebyte(posy);
    5. writebyte(kreuzOderKreis);
    6. sendmessage(blablasocket);

    Wobei man da auch noch sparen kann (posx und posy könnte man mit 4 bits(=1/2Byte) versenden.
    wupto.net/ Nicht meine Seite!
    We love Koalas.

    GM-D-Spam-o-Meter: 32%
  • MasterXY schrieb:

    Natürlich musst du eine Variable definieren, bevor du sie verwendest. Wenn es bei einem anderen Projekt hinhaut, liegt es wahrscheinlich daran, dass "Define undefinied variables as 0" angestellt is.

    ne, das ist ja im selben projekt... das ist ja das witzige o:


    und @henrik
    ich weiß nur ist das auch doof auszulesen, weil es nicht direkt erstellt wird sondern eher wenn man auf das feld klickt wird ein array umgeschrieben und dadurch wird das ganze dann gedrawt... (wegen xpos und ypos..)
    mfg Salmi
  • Benutzer online 1

    1 Besucher

  • Tags