39dll LAN-Serverliste

  • GM 7

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

  • 39dll LAN-Serverliste

    Ich bin gerade dabei ein Lan-Spiel zu programmieren. Ich möchte aber nicht, dass man manuell die IP eingeben muss, sondern dass alle Spiele in einer Liste gezeigt werden. Man braucht aber trotzdem noch einen Host für die Liste. Ich habe es schon versucht, indem ich einfach alle IP's durchprobiere, aber dabei hängt sich logischerweise das Spiel auf:

    GML-Quellcode

    1. myip = mplay_ipaddress();
    2. global.listip = -1;
    3. for(i=0;i<256;i+=1)
    4. {
    5. ip_1 = "192.168."+string(i)+".";
    6. for(j=0;j<256;j+=1)
    7. {
    8. ip_2 = ip_1+string(j);
    9. if ip_2 != myip
    10. {
    11. server = tcpconnect(ip_2, 31336, true);
    12. if server >= 0
    13. {
    14. global.listip = ip_2;
    15. exit;
    16. }
    17. }
    18. }
    19. if global.listip != -1
    20. exit
    21. }
    22. if listip != -1
    23. {
    24. clearbuffer(0);
    25. writebyte(SERVERLISTADDCLIENT,0);
    26. writestring(myip,0);
    27. sendmessage(global.listip,0,0,0);
    28. if global.host == 1
    29. {
    30. clearbuffer(0);
    31. writebyte(SERVERLISTADD,0);
    32. writestring(myip,0);
    33. sendmessage(global.listip,0,0,0);
    34. }
    35. }
    Alles anzeigen


    Hat jemand eine Idee wie man so etwas machen könnte?

    "Is this one sloshing?"
    Four words you don't want to hear when you pick up a coffin...

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

  • Aus der Hilfe:
    mplay_init_tcpip(addr) initialisiert eine TCP/IP Verbindung. addr ist ein String welcher die Internet- oder IP-Adresse enthält, z.B. 'www.gameplay.com' oder '123.123.123.12', möglicherweise gefolgt von einer Port-Nummer (z.B. ':12'). Nur wenn man eine Verbindung aufbaut (siehe unten) braucht man eine Adresse. Im LAN sind sie nicht nötig.

    Im LAN brauchst du also keine Adresse anzugeben, also z.B. einfach eine leere Zeichenkette. Es werden automatisch alle Spiele angezeigt, die irgendjemand im Netzwerk eröffnet hat.

    EDIT: Ups, da hab ich mich doch verlesen. Ich glaube aber mit der 39dll sollte es auch so funktionieren im LAN. Über das Internet brauchst du einen Server mit fester IP.
  • Es sollen aber mehrere Spiele gleichzeitig möglich sein.
    Deshalb brauche doch einen Host, der die Liste der Spiele weiterleitet, oder?
    Damit man dann im nächsten Schritt einem Spiel beitreten kann (Dessen IP durch den Host weitergeleitet wurde).
    Wenn schon eine Liste besteht (also schon ein Host da ist) soll keine neue Liste erstellt werden. Es muss also am Anfang überprüft werden, ob ein anderer Spieler da ist. Wenn ja, wird die Liste von diesem geladen.

    "Is this one sloshing?"
    Four words you don't want to hear when you pick up a coffin...
  • hmm.. auch wenn ich nie ein online spiel zum laufen gekriegt habe... (router kA .. xD)
    hab ich mir über sowas schon gedanken gemacht und das einfachste wäre einfach nen FTP server bei funpic zu nehmen und per FTP-dll/LIB
    eine 'serverliste' zu erstellen(eine ini datei)

    Quellcode

    1. [SERVER]
    2. IP0=255.255.255.0
    3. IP0PORT=80
    4. IP1=125.163.148.2
    5. IP1PORT=27980
    6. [ServerName]
    7. ADDR0=Ka 0plan Server
    8. ADDR1=xxx hier gibts auf die fresse xxx


    diese datei wird vom host also dem spielleiter immer neu erstellt also wenn ein server eröffnet wird wird die serverliste runtergeladen,abgeändert und wie aufn server hochgeladen

    das is die beste und am schnellsten realisierbarste taktik

    so einen backtrace zugriff den du hast ist auch schön jedoch nicht nett für andere PCs soweit ich weiß 'pingst' du sie dann ja auch
  • EDIT: Sorry Code auf mplay_-funktionen ausgelegt..

    Wie schon erwähnt, für eine LAN Serverliste brauchst du das alles nicht, weil im LAN alle server gefunden werden, die im netzwerk erstellt wurden.. da brauchst du dir im prinzip nur mit einer schleife die serverliste zeichnen...
    BSP:

    GML-Quellcode

    1. i=0
    2. serverlist=''
    3. with (obj_joinserver) instance_destroy()
    4. repeat (mplay_session_find())
    5. {
    6. serverlist+=mplay_session_name(i)+'# #'
    7. inst=instance_create(600,51+32*i,obj_joinserver)
    8. inst.sessnumb=i
    9. i+=1
    10. }

    obj_joinserver ist in dem Fall ein objekt, mit dem man dann dem jeweiligen server beitreten kann... Über die Variable sessnumb des objekts kann man dan abfragen, welcher session beigetreten wird.

    EDIT: Hoppla ist ja 39dll.. ABer da wird es wohl so ähnliche Funktionen geben nehme ich an...

    © 2008 by Teamgrill Productions
  • wolff schrieb:

    Danke euch!

    Ich werde das nachher mal ausprobieren. Hab im Moment wenig Zeit...

    @benny1111200: Bei einer Lan hat man ja selten Internet...


    huch sry hab nix mit län gelesen nur server liste :D x'D
  • Zum einen sollte man bei sowas mit UDP arbeiten, da es Zeitverschwendung ist, eine permanente Verbindung aufzubauen. Nun gibt es zwei Möglichkeiten, die die Last entweder auf den Servern oder den Clients haben.

    1) Jeder, der ein Spiel hostet, sendet in einem bestimmten Intervall UDP-Pakete mit seinen Serverdaten in das Netzwerk hinein. Wenn ein Client nun nach Servern sucht muss er nur kurz auf ein solches Intervall warten und erhält die Daten.

    2) Die andere Möglichkeit ist, dass der Client einfach UDP-Pakete in das Netzwerk hineinsendet, die eine Anfrage enthalten. Wenn ein Server ein solches Paket erhällt, schickt er an diesen Client ein Paket mit seinen Serverdaten zurück.

    Viel Spaß beim Umsetzen
  • Danke :) , aber ehrlich gesagt hab ich überhaupt keine Ahnung von UDP...
    Braucht man da nicht die IP des anderen?
    Und wenn nicht, wie sendet man dann Daten (sendmessage(sock,ip,port,buffer))?

    "Is this one sloshing?"
    Four words you don't want to hear when you pick up a coffin...
  • Bei UDP brauchst du schon auch eine IP, schließlich müssen die beteiligten Geräte auch wissen wo das Paket hingehört. Der größte Unterschied zwischen TCP und UDP ist, dass UDP keine Bestätigung fordert. Bei UDP weiß der Absender also im Gegensatz zu TCP nicht, ob das Datenpaket überhaupt ankam und wenn ja, ob es unbeschädigt ist.
    Was du meinen könntest ist die Broadcast IP, x.x.x.255, also beispielsweise im 192.168.10. Netz wäre das die 192.168.10.255. Daten, die an diese Broadcast IP gesendet werden erhalten automatisch alle in diesem Subnetzbereich adressierbaren IP Adressen, also im Falle unseres Beispiels 192.168.10.1 bis 192.168.10.254
    "Die Erde ist ein Irrenhaus. Dabei könnte das bis heute erreichte Wissen der Menschheit aus ihr ein Paradies machen. Dafür müsste die weltweite Gesellschaft allerdings zur Vernunft kommen."
    - Joseph Weizenbaum
  • Was Windapple erzählte ist nur die halbe Wahrheit, die Broadcast Adresse muss nicht unbedingt nur den letzten Block als 255 haben. Eine Broadcast Adresse könnte theoretisch auch 192.168.10.16 sein. Konkret hängt die Broadcastadresse nämlich von der Netzmaske ab, die häufig 255.255.255.0 ist. Um an die Broadcast Adresse zu kommen negiert man die Netzmaske (aus 255.255.255.0 wird 0.0.0.255) und Verknüpft diese mit einer beliebigen IP-Adresse des Subnetzes (i.d.R. die eigene) per oder. Aus 192.168.10.42 mit der Netzmaske 255.255.255.0 wird so 192.168.10.255, mit der Netzmaske 255.255.0.0 wird daraus jedoch 192.168.255.255.
  • Danke! Das hat mich schon ein Stück weiter gebracht. Von Broadcast hatte mir auch schon ein Freund erzählt, aber welche IP gebe ich dann beim Abhören der Nachricht an? Ich weiß ja nicht, von welchem PC die Nachricht gesendet wurde. Oder bin ich da im falschen Film? ?(

    "Is this one sloshing?"
    Four words you don't want to hear when you pick up a coffin...
  • Wenn du per TCP/IP oder UDP/IP ein Paket empfängst steht in dem Paketheader immer der Absender drin. Du musst nur rausfinden, wo du sowas über die 39Dll auslesen kannst.
    "Die Erde ist ein Irrenhaus. Dabei könnte das bis heute erreichte Wissen der Menschheit aus ihr ein Paradies machen. Dafür müsste die weltweite Gesellschaft allerdings zur Vernunft kommen."
    - Joseph Weizenbaum
  • Meine Frage war eigentlich, wie ich die Nachricht überhaupt empfange. Aber ich glaube, dass brauche ich gar nicht. Die Funktion sendmessage() sendet, falls ich das richtig verstanden habe, direkt in den buffer des Ziel-PCs. Ich glaube, das ist dann gelöst. Danke nochmal an Alle!

    edit: Ich bekomme das irgendwie immer noch nicht hin...Ich steig durch die ganzen Funktionen und die Ports und so nicht durch. Kann sich das vielleicht mal jemand angucken?

    skavie.sk.funpic.de/spiele/gmk/serverlist.gmk

    noch ein edit: Klappt jetzt! Ich hatte "255.255.0.0" als Netzmaske, brauchte aber "255.255.255.0"...Ist das doof...

    "Is this one sloshing?"
    Four words you don't want to hear when you pick up a coffin...

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