UDP - finde den Fehler nicht!

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

FreizeitCoder

Betreff: UDP - finde den Fehler nicht!

BeitragFr, März 21, 2008 0:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo zusammen. Ich versuche gerade eine UDP-Verbindung zwischen 2 PC´s herzustellen. Größtenteils halte ich mich an den Code des Buches. Ich habe lediglich den Code auf den anfänglichen (und simplen) Aufbau eines Pongklassikers verändert. Primär geht es mir um die UDP-Verbindung! Mein Fehler will mir einfach nicht auffallen.
Problem: Der Host-PC wartet vergeblich auf einen Client. Der Client startet korrekt ins Spiel. Es muß mit den ersten Daten zusammenhängen die der Host von dem Client benötigt um die IP zu bekommen. Genaue Zeile: Auf dem Bildschirm steht "warten auf anderen PC"

PS: die Hostmodus=1 Deklaration wird auf dem Client natürlich auf "0"geändert. Firewalls wurde auf beiden PC´s deaktiviert, und anderes UDP-Beispiel des Buches erfolgreich getestet.



Global bildbreite = 1024
Global bildhoehe = 768



;................................................................................................
;Repeat
; Cls
; host_IP$ = Input$("Bitte IP des Host eingeben (www.wieistmeineip.de): ")
; If hostmodus = 1
; sendeport = Input("Bitte den Sendeport des Host eingeben: ")
; empfangsport = Input("Bitte den Empfangsport des Host eingeben: ")
; Else
; empfangsport = Input("Bitte den Sendeport des Host eingeben: ")
; sendeport = Input("Bitte den Empfangsport des Host eingeben: ")
; EndIf
; Print
; Print
; Print
; hostmodus = Input("Spielen sie als Host(1) oder Client(0)? ")
; Print
; bildbreite = Input("gewuenschte Bildbreite(x)? ")
; bildhoehe = Input("gewuenschte Bildhoehe(y)?)? ")
; Print
; menue_verlassen$ = Input("Sind ihren Angaben korrekt? (j/n)?")
; If KeyHit(1) Then End
;Until menue_verlassen$ = "j"
;Print
;Print "OK, viel Spass! <Bitte Taste druecken>"
;WaitKey

host_IP$ = "192.168.178.21" ; kann gelöscht werden wenn die Eingabe durch den Benutzer erfolgt!
hostmodus = 1 ; kann gelöscht werden wenn die Eingabe durch den Benutzer erfolgt!
sendeport = 8001 ; kann gelöscht werden wenn die Eingabe durch den Benutzer erfolgt!
empfangsport = 8000 ; kann gelöscht werden wenn die Eingabe durch den Benutzer erfolgt!
If hostmodus = 1 Then ; kann gelöscht werden wenn die Eingabe durch den Benutzer erfolgt!
sendeport = 8000 ; kann gelöscht werden wenn die Eingabe durch den Benutzer erfolgt!
empfangsport = 8001 ; kann gelöscht werden wenn die Eingabe durch den Benutzer erfolgt!
EndIf ; kann gelöscht werden wenn die Eingabe durch den Benutzer erfolgt!



sendestream = CreateUDPStream(sendeport)
empfangsstream = CreateUDPStream(empfangsport)

If hostmodus = 0 Then
IP = IntegerIP(host_IP$)
Else
Print
Print
Print
Print "warten auf anderen PC...
Repeat RecvUDPMsg(empfangsstream)
If KeyHit(1) Then End
Until IP <> 0
Print "verbindung steht."
Print "IP-Adresse des Client: " + DottedIP(IP)
Print "<Bitte Taste druecken>"
WaitKey
EndIf

;................................................................................................

Graphics bildbreite, bildhoehe
SetBuffer BackBuffer()
Cls

Repeat
Cls

If RecvUDPMsg(empfangsstream) ;empfangener Spieler
y2 = ReadShort(empfangsstream)
EndIf

y1_alt = y1 ;lokaler Spieler
y1 = MouseY()
If y1 <> y1_alt
WriteShort sendestream, y1
SendUDPMsg sendestream, IP, sendeport
EndIf


If hostmodus=1
Rect 15, y1, 15, 70
Rect bildbreite - 65, y2, 15, 70
Else
Rect 15, y2, 15, 70
Rect bildbreite - 65, y1, 15, 70
EndIf

spielbremse = MilliSecs()
Repeat Until MilliSecs() - spielbremse > 20 ;Spielbremse ca. 30 FPS

Flip

Until KeyHit(1)
End

;................................................................................................

CloseUDPStream sendestream
CloseUDPStream empfangsstream

;................................................................................................

Function IntegerIP(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

Tankbuster

BeitragFr, März 21, 2008 1:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hasse diese UDP Beispiele -.-
Die sind allesamt sowas von schlecht. Man brauch nur EINEN Stream zum Empfangen und senden.

Dein Code ist auch nicht der übersichtigste und irgendwie gefallen mir diese ganzen Inputs nicht. Wink

Ich denke, das problem liegt in diesem Code-Ausschnitt.
Code: [AUSKLAPPEN]
Repeat RecvUDPMsg(empfangsstream)
If KeyHit(1) Then End
Until IP <> 0

Er ist einfach vollkommen sinnlos.
Mein Tipp: Such dir ein vernünftiges UDP-Beispiel. Im Forum gibts sicher ein paar client-server-dinger von mir Razz

Sry, wenn ich en bissl schlecht drauf bin (bzw. so klinge), aber irgendwie mag ich schlechte Beispiele nicht und bei UDP sind fast alle schlecht.
Twitter
Download Jewel Snake!
Windows|Android

Hagbard

BeitragFr, März 21, 2008 10:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Mein Tipp: Such dir ein vernünftiges UDP-Beispiel. Im Forum gibts sicher ein paar client-server-dinger von mir Razz

Sry, wenn ich en bissl schlecht drauf bin (bzw. so klinge), aber irgendwie mag ich schlechte Beispiele nicht und bei UDP sind fast alle schlecht.


Wo ich das gerade so lese...
Hast du nicht mal Lust eine vernünftige Einführung als Tutorial zu schreiben? Würde mich freuen, andere sicher auch.
 

FreizeitCoder

BeitragFr, März 21, 2008 18:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, sorry. Ich habe den Code nicht mehr aufbereitet.
Ich benütze 2 Streams um den Code so simpel wie möglich zu halten. 1 Empfangsstream, 1 Sendestream. Zum empfangen dort lesen, und zum senden dort rein schreiben.
So kann ich mich erstmal auf die Basics konzentrieren! Was auch notwendig ist wie man sieht. Das Buchbeispiel funktioniert wie gesagt. Mit kleinen Änderungen von mir tut es das nicht mehr! Wieso?
Das die Zeile die Du ansprichst vollkommen Sinnlos ist kann ich leider nicht bestätigen. Ich halte es für Sinnvoll in einem Testprogramm möglichst jeden Schritt quittieren zu lassen, um mögliche Fehler besser aufspüren zu können. Dadurch weiß ich jetzt zumindest, daß der Host schon vor der Spielschleife keine Nachricht vom Client bekommt.

Ich weiß, daß es oft nicht leicht ist, sich in umständliche Codes die für Anfänger nun mal viel einfacher zu handhaben sind, hineinzuversetzen. Trotzdem danke für den Versuch.

Tankbuster

BeitragFr, März 21, 2008 20:36
Antworten mit Zitat
Benutzer-Profile anzeigen
In deinem Programm wird hostmodus auf 1 gesetzt. aber IP bekommt nur einen wert zugewiesen, wenn hostmodus=0 Wink

Also ist es ganz logisch, dass diese schleife immer weiterlaufen wird, weil IP immer 0 sein wird:
Code: [AUSKLAPPEN]
Repeat RecvUDPMsg(empfangsstream)
If KeyHit(1) Then End
Until IP <> 0


Wink
Twitter
Download Jewel Snake!
Windows|Android
 

FreizeitCoder

BeitragSa, März 22, 2008 12:29
Antworten mit Zitat
Benutzer-Profile anzeigen
ole ole...
Nun bekomme ich eine Verbindung. Ich habe folgendes geändert:

Repeat
IP = RecvUDPMsg(empfangsstream) <<<<< geändert
If KeyHit(1) Then End
Until IP <> 0

Dabei sind mir 2 Dinge aufgefallen.
1. Die Ballbewegung sollte ich tunlichst nicht mit "writeshort" übergeben, da ich somit die negativen Werte verliere.
2. Die Verbindung ist so langsam, das es für einen Pongableger niemals reichen würde.

Mal sehen wie ich das noch optimieren kann. Nachdem ich nun meine Ergebnisse live überprüfen kann, ist es auch möglich Schritt für Schritt zu verbessern und ggf. mit anderen Prizipien zu vergleichen.

Danke nochmal für die Hilfe, Tankbuster. Wink

Tankbuster

BeitragSa, März 22, 2008 12:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Mir ist nochwas aufgefallen ^.^

DU ließt pro Schleifendurchlauf nur einmal den empfangsstream aus Wink
das ist eigentlich ziemlich schlecht, denn wenn mehrere Nachrichten angekommen wären, hättest du nur die erste gelesen, und die nächste im nächsten schleifendurchlauf. Dadurch kann es ziemlich schnell zu staus kommen.

Du brauchst noch eine extra-Schleife zum auslesen des streams.

Wenn du mit einem Stream arbeitest ist das sogar noch schlimmer aber erstmal egal...

Razz
So könntest du das lösen Wink
Code: [AUSKLAPPEN]

If RecvUDPMsg(empfangsstream)

   While ReadAvail(empfangsstream)
   y2 = ReadShort(empfangsstream)
   Wend
Endif



Ich weiß nicht, ob es deshalb so langsam läuft, oder es am Code liegt.
Aber eins kann ich dir versichern. Wir haben schon mit 7 Leuten mein altes Online-Game auf einem (Blitz3D) Server gespielt und alles lief flüssig. UDP ist nicht zu lahm für ein Pong Spiel ^^
Twitter
Download Jewel Snake!
Windows|Android
 

FreizeitCoder

BeitragSa, März 22, 2008 13:17
Antworten mit Zitat
Benutzer-Profile anzeigen
liegt sogar ganz sicher an meinem Code! Wink
Danke für den Tip. Werde das gleich mal umsetzen.
Ausserdem möchte ich nicht mehr jeden Schleifendurchlauf senden. Ich muß mich da mal an den optimalen Wert tasten.

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group