Grundsätzliche fragen zum Network-Gaming
Übersicht

DonutBetreff: Grundsätzliche fragen zum Network-Gaming |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hallo,
ich habe das erstellen von Multiplayerspielen eigentlich aus BB immer als recht einfach in erinnerung (über eine udp verbindung). Im vergleich hierzu erscheint es mir bei BlitzMax schon fast als eine kleine Katastrophe. Im Forum habe ich gelesen, dass man liebe BNetEx benutzen sollte, ist dies nur Windows-Kompatibel oder auf allen Plattformen einsetztbar? Und ist es wirklich so kompliziert in BlitzMax eine Verbindung aufzubauen? |
||
![]() |
Hummelpups |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ja, du kannst BNetEx benutzen.
Und ja, es ist Plattform unabhängig. |
||
blucode - webdesign - Ressource - NetzwerkSim
BlitzBasic 2D - BlitzMax - MaxGUI - Monkey - BlitzPlus |
Donut |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Wie bekomme ich denn BNetEx in die MaxGui eingebunden?
Wenn ich das Framework und MaxGui einbinde erhalte ich die Meldung Compile Error: Identifier 'TImage' not found Code: [AUSKLAPPEN] Import MaxGUI.Drivers
Framework Vertex.BNetEx oder Framework Vertex.BNetEx Import MaxGUI.Drivers |
||
![]() |
skey-z |
![]() Antworten mit Zitat ![]() |
---|---|---|
Du musst natürlich alle Module einbinden, die du benötigst | ||
Awards:
Coffee's Monatswettbewerb Feb. 08: 1. Platz BAC#57: 2. Platz |
PhillipK |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Grundsätzlich sei lieber ersteinmal eine runde faul und lade _KEIN_ framework.
Das wird zwar "größere" exen produzieren, aber sei es drum. Wenn du solangsam alles beisammen hast, was du benötigst, nutzt du den 'Framework Assistant' - google hilft dir hier - und fragst den, welches framework/module du so brauchst =) Dein fehler, TImage not found, kommt daher, das du "Framework" eingesetzt hast. Blitzmax kriegt dadurch gesagt, das du alles was du benötigst, per hand zusammenstellst. Da du aber kein Module importierst, welches TImage bereitstellt, kriegst du den fehler. Welches das nun grade ist, kann ich aber nicht sagen ![]() Ohne framework wird die modulesammlung "pub" komplett importiert. Keinerlei kopfzerbrechen, was du nun brauchst. Lediglich Bnetex solltest du importen ![]() |
||
n-Halbleiter |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Eine kleine Ergänzung zu deinem Post, PhillipK: Es wird auch die Modulsammlung "BRL" importiert. Und das Modul, das den Type TImage bereitstellt, ist (üblicherweise, wenn man kein anderes Grafikmodul nutzt) BRL.Max2D (bzw. BRL.D3D7Max2D für DirectX7-Grafik, BRL.D3D9Max2D für DX9-Grafik und BRL.GLMax2D für OpenGL-Grafik). | ||
mfg, Calvin
Maschine: Intel Core2 Duo E6750, 4GB DDR2-Ram, ATI Radeon HD4850, Win 7 x64 und Ubuntu 12.04 64-Bit Ploing! Blog "Die Seele einer jeden Ordnung ist ein großer Papierkorb." - Kurt Tucholsky (09.01.1890 - 21.12.1935) |
Donut |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Danke für die quallifizierte Antwort! ![]() |
||
![]() |
Jolinah |
![]() Antworten mit Zitat ![]() |
---|---|---|
Edit: Spinn ich jetzt, oder war da vorher nicht noch ein Post mit der Frage die ich eben beantworten wollte? ![]() Eines deiner Programme (Server) benötigt einen fixen Port den du selber auswählen kannst. Das andere Programm (Client) legt in der Regel gar keinen Port fest. Es wird automatisch vom System ein freier Port gewählt. Der Client verbindet sich dann mit dem fixen Port des Servers. Falls das alles in einem Programm untergebracht werden soll (Peer to Peer oder sowas), und beide Programme den gleichen Port verwenden sollen, dann kann das lokal nicht funktionieren. Da beim Start des ersten Programms der Port bereits belegt ist und das zweite diesen nicht auch noch nutzen kann. In dem Fall müsste das zweite Programm einen anderen Port nutzen, aber das erste Programm muss das natürlich auch wissen und zum richtigen Port verbinden. |
||
Donut |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Nein du spinnst nicht, aber ich hatte festgestelt, dass es nur an einem Tippfehler gelegen hat, dass es bei mir nicht funktioniert hat ![]() ![]() Gerade bereitet mir die ganze Geschichte echt Kopfzerbrechen, ich habe jetzt zwar mein Programm soweit, dass es mit der 172.0.0.1 bei mir auf dem Rechner zwar läuft, wenn ich es doppelt starte, wenn ich es dann aber übers Internet Teste passiert nichts... Hier mal ein paar auszüge aus meinem Code: Code: [AUSKLAPPEN] Global IP:String = "127.0.0.1"
Global Output_Stream : TUDPStream Global Input_Stream : TUDPStream Input_Stream = New TUDPStream If Not Input_Stream.Init() Then Throw("Can't create socket") If ButtonState(Radio1) = 1 Spieler = "Weiss" ElseIf ButtonState(Radio2) = 1 Spieler = "Schwarz" EndIf If Spieler = "Weiss" Input_Stream.SetLocalPort(2201) Runde = 1 ElseIf Spieler = "Schwarz" Input_Stream.SetLocalPort(2202) EndIf '------------------------------------------------------------------- Try If Input_Stream.RecvAvail() Then While Input_Stream.RecvMsg() ; Wend If Input_Stream.Size() > 0 Then Runde = 1 empf_ausgangsposition_x = Input_Stream.ReadLine().toInt() empf_ausgangsposition_y = Input_Stream.ReadLine().toInt() empf_folgeposition_x = Input_Stream.ReadLine().toInt() empf_folgeposition_y = Input_Stream.ReadLine().toInt() Figuren[empf_folgeposition_x,empf_folgeposition_y] = Figuren[empf_ausgangsposition_x,empf_ausgangsposition_y] Figuren[empf_ausgangsposition_x,empf_ausgangsposition_y] = "" draw_canvas(1) EndIf EndIf Catch Exception:Object WriteStdout("Error_Input~n " + Exception.ToString()) End Try '------------------------------------------------------------------- Try Output_Stream = New TUDPStream If Not Output_Stream.Init() Then Throw("Can't create socket") Output_Stream.SetRemoteIP(TNetwork.IntIP(IP)) Output_Stream.SetLocalPort() If Spieler = "Weiss" Output_Stream.SetRemotePort(2202) ElseIf Spieler = "Schwarz" Output_Stream.SetRemotePort(2201) EndIf Output_Stream.WriteLine(ausgangsposition_x) Output_Stream.WriteLine(ausgangsposition_y) Output_Stream.WriteLine(folgeposition_x) Output_Stream.WriteLine(folgeposition_y) Output_Stream.SendMsg() Catch Exception:Object WriteStdout("Error~n " + Exception.ToString()) End Try If Output_Stream Then Output_Stream.Close() Zu meiner schande gebe ich zu, dass es mehr Codeschnipsel-geklebe ist, als eigene Programmierkunst, deswegen warscheinlich auch einwenig Kraut und Rüben, gibts villeicht auch ein paar pauschale Dinge an denen so etwas liegen kann? |
||
PhillipK |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Donut:
Ich gestehe, ich hab wenig ahnung von Netzwerkprogrammierung ![]() Ich werfe deshalb einfach mal vermutungen in den Raum: Da es lokal geht, sollte es (wenn mich mein wissen nicht täuscht^^) auch über internet gehen. Allerdings gibts da immer die schöne sache mit dem Portforwarding ![]() Falls du die möglichkeit hast, versuche doch einmal per Lokalem netzwerk (2ter pc im haus?) das ganze zu testen. Anderfalls über hamachi zb. Wenn es dann immernoch hinhaut, ist der fehler bei den einstellungen (Router, firewall, etc) zu suchen, nicht im Code. Allerdings kann es auch sein, wenn es im LAN nit klappt, das trotzdem Firewall etc schuld sind - je nach "sicherheitsstufe" der einstellungen ![]() ps: ich sehe grade, das du die globale ip gesetzt hast. Die darf natürlich nicht so bleiben, wenn du es per inet testest :> deine "auswertige ip" erfährst du zb über www.wieistmeineip.de - dein gegenüber muss ebenfalls die richitge (server) ip in seinem programm haben! |
||
Donut |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Die globale IP ist nur der default wert, im Programm wird sie natürlich gesetzt ![]() Danke für deine tipps, ich werde mal schauen was passiert und dir dann erneut bericht erstatten. ![]() Also 1 Computer über die Lokale 172er IP - Funktioniert 2 Computer über die 192er Netwerk-IP - Funktioniert 2 Computer über die "echte" IP - Funktioniert nicht Ich hoffe das hilft weiter... (die Firewall meldet sich natürlich sobalt ich das Programm starte und ich lasse das Programm dann auch zu) |
||
![]() |
ZEVS |
![]() Antworten mit Zitat ![]() |
---|---|---|
Über die öffentliche IP zuzugreifen, ist sehr schwierig. Je nach lokalem Netzwerk finden die Verbindungen nur über den Router statt, der dann auch alle Verbindungen nach außen verwaltet. Dann bekommst du lediglich die öffentliche IP deines Routers, da dein Rechner keine hat. Ansonsten ist es aber auch möglich, dass das die Firewall deines Routers unterbindet. Dann bräuchtest du Hole-Punching, was aber nur über Client-Server-Client läuft. Der jetzige Code sieht nach einer anspruchsvollen Client-Client Lösung aus.
Wenn du keine Erfahrung mit UDP hast, möchte ich dir empfehlen, mit TCP und Client-Server-Client zu arbeiten, wobei der Server ein richtiger Server mit eigener, statischer und öffentlicher IP ist. Die Netzwerkgeschwindigkeiten steigen momentan, sodass das performancetechnisch nicht zu schwierig wird (mit 20 MBit/s schaffst du deine 8 Bytes [s.u.] in wenigen Millisekunden). TCP ist wesentlich einfacher. Da es hier zu den Grundsetzen von Netzwerkprogrammierung geht: Zitat: BlitzMax: [AUSKLAPPEN]
Ich weiß zwar nicht sicher, ob es eine ReadInt()-Funktion gibt, das wäre aber gewiss sinvoller. Damit kannst du die Größe der Pakete reduzieren, bzw. die Anzahl der Übertragbaren Parameter erhöhen (UDP kann mit einer Nachricht nur 255 Bytes transportieren). Außerdem ist die Frage, ob nicht Shorts ausreichen würden. ZEVS |
||
Donut |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Danke für deine Anregungen,
allerdings brauche ich dann ja einen Server der immer Online sein muss, um spielen zu können, und mit der BNetEx macht es glaube ich keinen großen unterschied ob ich udp oder tcp nehme (außer das tcp evtl. funktionieren könnte ![]() PS: Shorts würdens auch tun, da hast du recht... |
||
![]() |
ZEVS |
![]() Antworten mit Zitat ![]() |
---|---|---|
Zum Testen, ob du Internetverbindungen über die Router-IP hast, reicht es, mit zwei verschiedenen Rechnern eines Netzwerkes die IP über eine dieser IP-Seiten zu ermitteln. Sind diese gleich, ist es die Router-IP, die einzige nach außen sichtbare IP. Dann kannst du nur TCP benutzen.
Zum Testen der Firewall kann man einen Hole-Punch probieren: Wenn man von A nach B eine UDP-Nachricht sendet, wird die bei B normalerweise durch die Firewall geblockt und verworfen. In der Firewall von A ist jetzt aber ein "Loch", da die Firewall von A nun UDP-Nachrichten von B als Antwort auf die erste Nachricht erkennt und durchlässt. Heißt zum Testen: Zwei Rechner, mit denen du untereinander keine UDP-Verbindung aufnehmen kannst, bilden das A und B obiger Vorgehensweise. Dafür schreibst du dir ein Testprogramm, das Nachrichten sendet und empfängt (ohne Kontrolle). Dieses lässt du auf beiden Rechnern laufen. Die erste Nachricht dürfte nicht ankommen, aber ein Loch in die Firewall boren. Die erste Nachricht von B müsste dann ankommen und danach auch alle anderen Nachrichten von A und B. Dann ist die Verbindung da. Wenn das klappt, musst du einen TCP-Server erstellen, zu dem die Clients eine Verbindung aufnehmen. Das ist wichtig, da man zum Hole-Punchen die IP des anderen braucht, die man nur mit Client-Client natürlich nicht bekommt. Der Server gibt einfach die Liste der aktuellen Client-IPs an. Damit kannst du HolePunchen. Stellt sich die Frage, ob du das Spiel gleich über den TCP-Server laufen lässt. TCP wird von den Firewalls viel eher akzeptiert als UDP. Es ist zwar langamer, aber HolePunching wurde erst mit Skype-Anrufen erfunden, die ja Audiodaten in Echtzeit übertragen müssen. Bei einer solchen Datenmenge und einer solchen Zeitspanne braucht man natürlich Client-Client-UDP. Stellt sich die Frage, ob du das auch brauchst. ZEVS |
||
Donut |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Okay du hast mich überzeugt ![]() Mir fehlt nur noch ein bisschen das verständniss für TCP. Wie genau läuft das mit dem Server? Kann ich jeden server nehmen, muss ich den Server einrichten, muss ich bestimmte ports nehmen,ect...? Kannst du mir das eventuell in ein zwei Sätzen ein bisschen näher bringen? (Und danke für deine ausführliche Erklärung) |
||
![]() |
ZEVS |
![]() Antworten mit Zitat ![]() |
---|---|---|
TCP läuft über Verbindungen. Das heißt, der Server sagt seiner Firewall "Ich bin ein Server für Port xxxx für TCP, bitte leite alle Verbindungen an mich weiter". Der Client öffnet eine solche Verbindung für die IP des Servers. Hierbei kann also nur noch der Router nerven. Danach besteht ein sog. Socket zwischen Client und Server. Man benutzt es wie einen Dateistrom; was man selbst reinschreibt, kann der andere lesen und umgekehrt. Es besteht keine Längenbegrenzung und alle Nachrichten kommen garantiert an (und in der richtigen Reihenfolge), wenn es nicht zum Timeout kommt. Danach gilt das Socket als "tot" und die Verbindung als gewaltsam beendet. Das muss man vor jeder Read/Write-Aktion prüfen. Außerdem bedeutet das TCP-Timeout von 10sec, dass der Server 10sec lang auf einen toten Client wartet - und alle anderen Verbindungen vernachlässigt. Deshalb sollte man das Timeout beim Server runtersetzen. Alternativ kann man die Abarbeitung eines Clients auf einen eigenen Thread delegieren, dann braucht man sich um nichts mehr zu kümmern.
Zum Server: Dein lokaler Rechner wechselt normalerweise seine IP alle 24 Stunden, damit gespeicherte IPs von besuchten Websites wertlos werden. Deswegen brauchst du einen Server mit statischer, öffentlicher IP (einfach mal beim Provider nachfragen). Außerdem gibt nicht-Server-Hardware gern mal den Geist nach mehreren Monaten nonstop-Online auf. BMax-Befehle (BRL.Socket): CreateTCPSocket für Server und Client, BindSocket für den Server ("Ich bin ein Server für Port xxxx") sowie SocketListen, ConnectSocket für Client zum Verbundung aufnehmen, SocketAccept zum Verbindung annehmen und SocketConnected zum Überprüfen auf tote Sockets. Rumschreiben mittels der Read- und Write-Befehle. Tutorials für TCP gibt es eigentlich massenhaft, vor allem in BB (man muss halt für BMax umdenken). ZEVS |
||
Donut |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Okay ich glaube ich stehe gerade ziemlich auf dem Schlauch, was die Server geschichte angeht...
Ich habe mir das Ganze so vorgestellt: Spieler 1 gibt die IP von spieler 2 ein und umgekehrt, diese werden dann ins Programm eingegeben. Danach wird (irgendwie) eine Verbindung zwischen den beiden Spielern aufgebaut. Wenn ich das jetzt per TCP realisieren möchte, brauche ich dann einen Webserver oder übernimmt der Computer von einem der beiden Spieler die rolle des Servers? Wenn ich einen Server brauche: Was muss das für ein Server sein? Bezieungsweise was muss auf den Server damit ich ihn ansprechen kann? In den Beispielen ist immer "www.blitzmax.com" oder "www.example.com" angegeben aber ich kann ja wohl schlecht einfach irgendeine Domain die ich mir(oder jemand anders) eingerichtet habe als Server nehmen. Ich hoffe es ist jetzt etwas deutlicher geworden, wo es bei mir noch nicht klick gemach hat und danke für die Hilfe, Donut |
||
![]() |
ZEVS |
![]() Antworten mit Zitat ![]() |
---|---|---|
Bei Client-Client wirst du schnell mal ungewollte Bekanntschaft mit den Firewalls machen. In solchen Fällen gibt ein Client A den Server und ein anderer B den Client, wenn die Firewall nicht blockt, stellt A sein Spiel auf einen Server-Modus und B gibt die IP von A an. Man hat hier alle Nachteile von UDP-Client-Client, außer, dass TCP von Firewalls lieber gesehen ist. Nach meiner Erfahrung kommt aber keine Verbindung zustande.
Was du mit Server meinst, ist schon ganz richtig. Du brauchst nur keine Domain (denn www.google.de ist nur ein Synonym für 209.85.149.104; siehe http://209.85.149.104/), was heißt, dass du dir die DNS-Geschichte sparen kannst (es seie denn, du möchtest auf dem Server eine Projektwebsite onlinestellen). Der Server braucht eine sog. statische IP-Adresse, das haben normale PCs nicht. Statische IP-Adressen gibt es beim Provider, einfach mal nachfragen. Die wesentlich beliebtere Alternative sind sog. Virtual-Server. Über diesen Server hast du normalerweise Zugriff über die Konsole und FTP, sodass du ihn von deinem Zuhause aus verwalten kannst. Damit sparst du dir die ganzen Hardware-Geschichten und die IP-Bürokratie. Ich kann dir hier keine Empfehlungen geben, für Webauftritte empfehle ich Webgo24, aber die VServer kosten hier mindestens 39€, was woanders wesentlich billiger geht (ich lese mir diese *-Texte aber nicht durch). Auf deinem Server läuft ein spezielles Server-Programm, das Clients entgegennimmt, Clients vermittelt (sodass man nicht die IP des anderen kennen muss, sondern dessen Nickname) und Spieldaten weiterleiten. Die Clients melden sich am Server an, holen sich (regelmäßig) die Liste verfügbarer Gegner, lassen den Benutzer auswählen, steuern dann das Spiel und synchronisieren sich mit dem Server. Das heißt auch, dass die Client-Executable die IP des Servers wisen muss - deswegen statische IP. Genauere Daten in meinem letzten Post. ich hoffe, du weißt jetzt, wovon ich rede. ZEVS |
||
PhillipK |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Herrje, ich denke, bevor hier empfehlungen zum Servermieten gestellt werden, sollte ersteinmal geklärt werden, was das Endziel ist.
Möchtest du, das jeder Nutzer mit jedem spielen kann? Dh eine art Spieleliste, wo sich die user ihre Gegnerlisten herholen und welche herausfordern können? Oder soll man eher im Freundesrahmen miteinander spielen können? Fürs erstere: Hier ist _irgendwann_ ein server ratsam. Bis dahin reicht es, wenn du die Serverarchitektur programmierst und eine händliche Server-ip-eingabe ermöglichst. -> hamachi zum testen. So brauchst du nicht direkt in die Tasche greifen und geld evtl zum fenster rauswerfen. Sollte dein Projekt von erfolg gekrönt sein kannst du immernoch über einen Server nachdenken ![]() Fürs 2tere könnte es schon reichen, wenn du Lokales netzwerk unterstützt und mit Hamachi zb auch verbindungen ermöglichst. Ich bin grundsätzlich der meinung, das jede art von Netzwerkspiel einen LAN modus haben sollte und auch per Hamachi läuft. Ich bin da einfach verwöhnt ![]() |
||
Donut |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
ZEVS hat Folgendes geschrieben: Auf deinem Server läuft ein spezielles Server-Programm, das Clients entgegennimmt, Clients vermittelt ZEVS Was ist das dne für ein Serverprogramm? Gibts da ein spezielles oder wird das mit der BNetEx mitgeliefert? Und muss es gleich ein ganzer eigener Server sein oder tuts da für Testzwecke auch so ein gratis Webspace von bplaced oder ähnlichen Anbietern? PhillipK hat Folgendes geschrieben: Fürs erstere:
Hier ist _irgendwann_ ein server ratsam. Bis dahin reicht es, wenn du die Serverarchitektur programmierst und eine händliche Server-ip-eingabe ermöglichst. -> hamachi zum testen. Was heist denn eine Serverarchitektur programmieren? Klingt sehr abenteuerlich und nach nem Master in Technische Informatik ![]() Also was ich eigentlich vorhabe: Ich habe ein kleines Schachprogramm geschrieben (und ja ich weis das es so etwas schon gibt ![]() Also danke noch einmal für die ausfühliche Hilfe, wenn dass hier durchgekaut ist schreibe ich mal eine kleine Zusammenfassung bzw Anleitung ![]() Freundliche Grüße Donut |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group