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

Übersicht BlitzBasic Allgemein

Dieses Thema ist gesperrt, du kannst keine Beiträge editieren oder beantworten.

Akiba

Betreff: Spiele im Netzwerk ... sie mögen mich nicht!

BeitragMi, Mai 18, 2011 4:01
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Mai 18, 2011 4:27
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Wink
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.

BladeRunner

Moderator

BeitragMi, Mai 18, 2011 13:02
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Mai 18, 2011 14:25
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Exclamation Question
Ich habe Berthold gebrochen.

Akiba

BeitragMi, Mai 18, 2011 16:42
Antworten mit Zitat
Benutzer-Profile anzeigen
@ 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...

Xeres

Moderator

BeitragMi, Mai 18, 2011 17:17
Antworten mit Zitat
Benutzer-Profile anzeigen
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

Hangman

BeitragMi, Mai 18, 2011 18:21
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Mai 18, 2011 19:01
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Mai 18, 2011 19:05
Antworten mit Zitat
Benutzer-Profile anzeigen
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? Embarassed
Luigi, man wendet sich nich gegen Familie...
 

Hangman

BeitragMi, Mai 18, 2011 21:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich glaube solche Aussagen sind hier nicht gern gesehen Wink
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 Shocked
Ich nehme an das war ein Beispiel, in der Praxis ist 50 pro Sekunde ja schon recht viel.
Ich habe Berthold gebrochen.

Akiba

BeitragMi, Mai 18, 2011 21:58
Antworten mit Zitat
Benutzer-Profile anzeigen
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...

BladeRunner

Moderator

BeitragDo, Mai 19, 2011 6:47
Antworten mit Zitat
Benutzer-Profile anzeigen
...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

Dieses Thema ist gesperrt, du kannst keine Beiträge editieren oder beantworten.


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group