UDP - finde den Fehler nicht!
Übersicht

FreizeitCoderBetreff: UDP - finde den Fehler nicht! |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ; hostmodus = Input("Spielen sie als Host(1) oder Client(0)? ") ; bildbreite = Input("gewuenschte Bildbreite(x)? ") ; bildhoehe = Input("gewuenschte Bildhoehe(y)?)? ") ; menue_verlassen$ = Input("Sind ihren Angaben korrekt? (j/n)?") ; If KeyHit(1) Then End ;Until menue_verlassen$ = "j" ;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 "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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. ![]() 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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
In deinem Programm wird hostmodus auf 1 gesetzt. aber IP bekommt nur einen wert zugewiesen, wenn hostmodus=0 ![]() 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 ![]() |
||
Twitter
Download Jewel Snake! Windows|Android |
FreizeitCoder |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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. ![]() |
||
![]() |
Tankbuster |
![]() Antworten mit Zitat ![]() |
---|---|---|
Mir ist nochwas aufgefallen ^.^
DU ließt pro Schleifendurchlauf nur einmal den empfangsstream aus ![]() 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... ![]() So könntest du das lösen ![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
liegt sogar ganz sicher an meinem Code! ![]() 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. |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group