Spiele im Netzwerk ... sie mögen mich nicht!
Übersicht

![]() |
AkibaBetreff: Spiele im Netzwerk ... sie mögen mich nicht! |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo Leute!
Seit vielen Monaten schon versuche ich in schönen unregelmäßigen Abständen ein Netzwerkspiel zu programmieren. Das fängt immer damit an, dass ich erst einmal versuche, mich mit der Materie Netzwerkprogrammierung unter Blitz 3D auseinander zu setzen. Dumm ist nur, dass es auch immer damit schon aufhört. Denn es klappt einfach nie. Ich habe SimpleUDP ausprobiert, aber bei einem Test wurde eine Funktion nicht gefunden, womit ich SimpleUDP den Rücken zukehrte. Vor wenigen Minuten hatte ich das selbe Problem mit LAMA. Wobei ich sagen muss, dass ich auch keinen userlibs-Ordner in meine, Blitz 3D-Verzeichnis fand, in welchem man die LAmaNet.decls hätte hineinkopieren sollen. Ich hatte es einfach mal versucht, den Ordner userlibs selbst zu erstellen und die .decls-Datei dort hinein verschoben. Brachte nix. Hat das vielleicht damit etwas zu tun, dass der Pfad anstatt "C:\Programme\Blitz3D" "C:\Program Files (x86)\Blitz3D" ist? Jedenfalls hatte ich auch schon versucht, einfach die Befehle zu benutzen, die von Blitz bereit gestellt werden. Das Ergebnis ist hier zu sehen: Code: [AUSKLAPPEN] Graphics 800, 600, 32, 3
warten = CreateTimer(2) sende_stream = CreateUDPStream(8001) empfangs_stream = CreateUDPStream(8000) send_msg$ = Input("Gib deine Nachricht ein: ") send_ip_x$ = Input("Partner-IP: ") send_ip = INT_IP(send_ip_x$) Print send_ip Repeat ip = RecvUDPMsg(empfangs_stream) If ip <> 0 Then Color 0, 255, 0 Print ReadLine(empfangs_stream) Else Color 255, 0, 0 Print "Keine Nachricht emfpangen!" EndIf WriteLine(sende_stream, send_msg$ + MilliSecs()) SendUDPMsg sende_stream, send_ip If KeyHit(1) Then End WaitTimer(warten) Forever Function INT_IP(IP$) a1 = Int(Left(IP$, Instr(IP$, ".") - 1)) : IP$ = Right(IP$, Len(IP$) - Instr(IP$, ".")) a2 = Int(Left(IP$, Instr(IP$, ".") - 1)) : IP$ = Right(IP$, Len(IP$) - Instr(IP$, ".")) a3 = Int(Left(IP$, Instr(IP$, ".") - 1)) : IP$ = Right(IP$, Len(IP$) - Instr(IP$, ".")) a4 = Int(IP$) Return (a1 Shl 24) + (a2 Shl 16) + (a3 Shl 8 ) + a4 End Function In diesem kleinen Programm sollte man eine IP eingeben und eine Nachricht versenden und empfangen können. Gibt man nun einen anderen Menschen das selbe Programm und man gib die IP des jeweils anderen ein, so hätte es gehe sollen, was es aber nicht tat. Btw: Einen Server gibt es hierbei nicht, sondern nur 2 Clients bzw. 2 mal den selben, eben auf verschiedenen Rechnern. Die Sache ist, bei diesen Netzwerkgeschichten bin ich mir immer total ungewiss wo ich stehe. Ich habe immer ein paar unbeantwortete Fragen: 1. Müssen ich oder meine Kumpels Ports freischalten? (...was mein Router wohl noch nichteinmal unterstützt...) 2. Was ist mit der Firewall? 3. Warum geht einfach nix?? (SimpleUDP, LAMA, Blitz mit "Standart"-UDP) Man kann schon sagen, dass ich etwas verzweifelt bezüglich dieser ganzen Sache bin und hoffe, das ihr mir aus dieser Misere raus helfen könnt. Besonders wichtig wären mir Antworten auf meine drei gestellten Fragen, aber auch auf alles andere, was ihr als wichtig empfindet. Danke schonmal =) |
||
Luigi, man wendet sich nich gegen Familie... |
Hangman |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Zitat Holzchopf:
Code: [AUSKLAPPEN] Graphics 400, 300, 0, 2
SetBuffer BackBuffer() Global TIMER = CreateTimer(30) ; IP und Port des Gegenübers Global partnerIp, partnerPort Type TMessage Field txt$ Field col End Type Const STATE_SETUP = 0 Const STATE_JOIN = 1 Const STATE_GAME = 2 Global state = STATE_SETUP Global Stream Global inputText$, inputTextTemp$ ; Hauptschleife While Not KeyDown(1) Select state Case STATE_SETUP Setup Case STATE_JOIN Join Case STATE_GAME Game End Select FlushKeys() Flip 0 WaitTimer TIMER Cls Wend End Function Setup() If KeyHit(2) ; Server erstellen Stream = CreateUDPStream(9000) ; fixer Port Message("Server erstellt", $AAAAAA) state = STATE_GAME ElseIf KeyHit(3) state = STATE_JOIN EndIf Text 0,0, "1: Server" Text 0,20, "2: Client" End Function Function Join() If Input() ; lokalen Stream erstellen Stream = CreateUDPStream() ; variabler Port ; Serververbindung aufbauen partnerIp = StrToIntIP(inputText) ; IP und partnerPort = 9000 ; Port des Servers sind bekannt ; Anmelden WriteByte Stream, $00 SendUDPMsg Stream, partnerIp,partnerPort Message("Verbindungsaufbau", $AAAAAA) state = STATE_GAME EndIf Text 0,0, "IP des Servers eingeben:" Text 0,20, inputTextTemp End Function Function Game() Local ip = RecvUDPMsg(Stream) If ip Local msgType = ReadByte(Stream) Select msgType ; Verbindungsanfrage Case $00 ; erst hier erfährt der Server IP und Port des Clienten partnerIp = ip partnerPort = UDPMsgPort(Stream) WriteByte Stream, $01 SendUDPMsg Stream, partnerIp, partnerPort Message("Client verbunden", $AAAAAA) ; Verbindungsaufbau Case $01 Message("Verbindung aufgebaut", $AAAAAA) ; Nachricht Case $10 Message(ReadString(Stream), $00FF00) End Select EndIf If Input() Message(inputText, $0080FF) WriteByte(Stream,$10) WriteString(Stream,inputText) SendUDPMsg Stream, partnerIp, partnerPort EndIf DrawMessages Color 255,255,255 Text 0, 260, "Nachricht:" Text 0, 280, inputTextTemp End Function ; leicht erweiterte Inputfunktion Function Input() Local char = GetKey() If char = 8 If Len(inputTextTemp)>1 inputTextTemp = Left(inputTextTemp, Len(inputTextTemp)-1) Else inputTextTemp="" EndIf ElseIf char>31 inputTextTemp = inputTextTemp +Chr(char) ElseIf char=13 inputText = inputTextTemp inputTextTemp = "" Return True EndIf End Function Function Message(pMessage$, pColor) Local msg.TMessage = New TMessage msg\txt = pMessage msg\col = pColor End Function Function DrawMessages() Local y = 240 Local msg.TMessage = Last TMessage Repeat Color 0,0,msg\col Text 0,y, msg\txt If y < 0 Delete msg EndIf y = y -20 msg = Before msg Until msg = Null End Function Function StrToIntIP(pIP$) Local b1 = Int(Left(pIP$,Instr(pIP$,".")-1)):pIP$=Right(pIP$,Len(pIP$)-Instr(pIP$,".")) Local b2 = Int(Left(pIP$,Instr(pIP$,".")-1)):pIP$=Right(pIP$,Len(pIP$)-Instr(pIP$,".")) Local b3 = Int(Left(pIP$,Instr(pIP$,".")-1)):pIP$=Right(pIP$,Len(pIP$)-Instr(pIP$,".")) Local b4 = Int(pIP$) Return (b1 Shl 24) + (b2 Shl 16) + (b3 Shl 8 ) +b4 End Function Ja du musst einen Port freischalten als Server, Router schicken nicht immer auf dem Port den du angibst, daher die dynamische Portverwaltung wie hier im Beispiel zu sehen. Schau dir Holzchops Beispiel einfach mal an, ich persönlich habe keine Erfahrung mit Lama oder SimpleUDP, ich habe früher mit Blitz-Bordmitteln aber auch keine Probleme gehabt, bin aber aufgrund von Performanceproblemen später auf XNET umgestiegen(was nicht an den Mitteln lag, sondern schlechter Umsetzung meinerseits). Soll keine (Anti-)Werbung für XNET sein, ich würde ohne die Libs zu kennen zu SimpleUDP oder Lama raten^^ allein schon aus dem Grund, dass XNET nicht mehr Win7 kompatibel ist(Strings senden erzeugt z.b. einen Error) und SUDP & Lama scheinen ja recht beliebt zu sein, dann sind die bestimmt auch ganz gut ![]() Bei einem Beispielcode deinerseits mit einer der Libs wird dir sicherlich auch jemand helfen können. PS: Zitat: Btw: Einen Server gibt es hierbei nicht, sondern nur 2 Clients bzw. 2 mal den selben, eben auf verschiedenen Rechnern.
zu deinem Beispielcode fehlt noch ein Gegenstück, wenn beide auf 8001 senden und auf 8000 empfangen kann ja sowieso schonmal nichts ankommen. Gruß Hangman |
||
Ich habe Berthold gebrochen. |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ist dein BB denn auf neustem Stand, es verwundert mich dass da kein Userlibs-Ordner sein soll.
Welche Version benutzt Du denn? |
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
Hangman |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ist das nicht das gleiche Problem von dir gewesen? https://www.blitzforum.de/foru...p?p=374976
Da hattest du am Ende geschrieben es funktioniert ![]() ![]() |
||
Ich habe Berthold gebrochen. |
![]() |
Akiba |
![]() Antworten mit Zitat ![]() |
---|---|---|
@ Hangman: Ja richtig, das hatte schon mal funktioniert, jedoch kann ich an das Programm gerade nicht rankommen, womit ich die Sache jetzt wieder (fast) neu lernen musste. Ich hatte das damals aus unterschiedlichen Gründen nicht weiter gemacht. Was mich wundert ... es lief damals, glaube ich, ohne Ports freizuschalten(!?). Das Programm sah fast wie mein jetziges aus, nur dass man vor dem Start den Sende- und den Empfangsport selbst einstellen musste. An der Stelle habe ich dieses Mal wohl nicht nachgedacht, ich muss meinem Gegenüber andere Ports zuweisen... das war etwas blöde von mir ^^
Wie man im letzten Beitrag meines alten Themas bewundern kann, hatte ich da auch mein Problem mit SimpleUDP. LAMA hatte ich glaube ich nicht verwenden wollen, weil es nur über LAN geht (oder?????). Da hatte ich aber die Option Hamachi vergessen. Und im Moment wäre es eher meine Wahl, weil die Dokumentation gut zu sein scheint und die Hilfe über SimpleUDP ja eh überarbeitet wird und nicht verfügbar ist. @ Blade Runner: IDE 1.66, Linker 1.64, Runtime 1.66 Danke euch beiden für eure Beteiligung! Eine Frage noch zusätzlich: Was passiert eigentlich, wenn man an den Server zwei Nachrichten zu selben Zeit sendet? Erhält man mit RecvUDPMsg dann nur die neueste und die ältere im nächsten Aufruf der Funktion? Wenn ja, muss dann der Server seine Hauptschleife nicht wesentlich öfter durchlaufen lassen als die Clients? |
||
Luigi, man wendet sich nich gegen Familie... |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Na dann Ruckzuck bei BB.com einloggen und Updaten. Wie du in der rechte Leiste des Portals ablesen kannst, ist 1.106 die neuste Version. | ||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
Hangman |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Zu deiner Zusatzfrage: Alle Nachrichten kommen an(es sei denn sie gehen anderweitig verloren), es stört aber nicht, wenn 2 Clients mal so gut wie gleichzeitig senden sollten. | ||
Ich habe Berthold gebrochen. |
![]() |
Akiba |
![]() Antworten mit Zitat ![]() |
---|---|---|
Okay, aber bei RecvUDPMsg wird immer nur eine Nachricht ausgelesen, oder? Ich dachte da nur, wenn angenommen 50 mal pro Sekunde ein Client eine Nachricht schickt und es gibt 3 Clients, dann sind das 150 Nachrichten pro Sekunde. Muss dann der Server mindestens 150 mal pro Sekunde RecvUDPMsg ausführen?
Ein weiteres Problem muss ich noch hinzufügen. Bei meinem Programm, welches ich in meiner ersten Nachricht gepostet habe, müssen da Ports freigescheltet werden? Beim Portsfreischalten habe ich immer Probleme. Ich habe meiner Windows-Firewall bereits gesagt, dass mein Programm kommunizieren darf, ich habe auch extra für die 2 Ports (8000 und 8001) Regeln hinzugefügt zur Firewall. Funzt aber nicht. Mein Router stellt keinerlei Software bereit, mit dem man Ports freischalten / weiterleiten könnte. Reicht das mit der Firewall aus im zu funktionieren? Ich hab das bereits auch getestet, aber es geht nicht. Selbst wenn mein Kumpel keine Ports freigeschalten hat, sollte ich doch zumindest seine Nachrichten empfangen können, oder? |
||
Luigi, man wendet sich nich gegen Familie... |
![]() |
Akiba |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ach, ich vergaß: das mit dem Updaten ist ein Problem für mich. Bitte fragt jetzt nicht warum ^^
Wenn ich mal flüssig bin, dann ... okay? ![]() |
||
Luigi, man wendet sich nich gegen Familie... |
Hangman |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ich glaube solche Aussagen sind hier nicht gern gesehen ![]() Das kann ohne Portfreischaltung klappen, muss es aber nicht^^ in den meisten Fällen wird es nicht klappen, meiner Erfahrung nach. Deinen Router erreichst du über deinen Browser, indem du dessen IP ins Adressfeld eingibst. Bei Win7 (ob Vista auch weiß ich nicht) findest du den Router auch in der Netzwerkumgebung und kannst per Rechtsklick "Gerätewebsite anzeigen" auswählen. Und zu der Recv-Frage, ja bei 150 eingehenden Nachrichten pro Sekunde musst du per Schleife natürlich auch alle diese Nachrichten abholen, folglich 150 mal in der Sekunde ![]() Ich nehme an das war ein Beispiel, in der Praxis ist 50 pro Sekunde ja schon recht viel. |
||
Ich habe Berthold gebrochen. |
![]() |
Akiba |
![]() Antworten mit Zitat ![]() |
---|---|---|
Naja wie man zu der Router-Website weis ich, aber da gibts keine einzige Option, die auf Portfreischaltung hindeuten lässt. Hab n Router von T-Com. Das regt mich total auf, dass das auf jeden Router leicht zu gehen scheint, aber gerade bei meinem nicht...
Hm, nicht gern gesehen ... so ist es nun mal und ich stehe dazu! Ich will mich auch in nächster Zeit um dieses "Problem", so dass dann alles mit rechten Dingen zugeht .... : / |
||
Luigi, man wendet sich nich gegen Familie... |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
...und sobald du BB legal benutzt und auf dem neusten Stand bist wirst Du hier Hilfe erhalten.
~GESCHLOSSEN~ Es ist sinnfrei mit einer veralteten Version Erklärungen zu versuchen, da sich vieles geändert hat. Daher funktionieren auch die Userlibs nicht. Wenn Du BB nutzen willst wirst Du dafür sparen müssen. Sobald Du BB legal erworben hast darfst Du hier wieder threads erstellen, schicke mir dazu einen Screenshot von deinem Account-Schirm, bei dem die BUID unkenntlich gemacht ist. Vorher darfst Du hier keine threads mehr erstellen. |
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group