Problem bei der Datenübertragung mit UDP

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

Herox

Betreff: Problem bei der Datenübertragung mit UDP

BeitragFr, Mai 29, 2009 19:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Guten Tag,
Hallo Leute ich bin erst neu hier und hab auch gleich ein Problem
nähmlich habe ich vorgehabt mit Udp ein Einfaches Spiel zu erstellen indem man sich
als eine Cube bewegt das Problem daran ist ich kann es Local Testen da funtioniert auch
alles soweit aber wenn ich es I-Net Teste dann werden die Positionen
nicht richtig zu den anderen Spielern übertragen aber obwohl der Server sie empfängt
brauche bitte eure Hilfe währe sehr Dankbar.

Hier ist mein Server:
Code: [AUSKLAPPEN]

AppTitle "Server"
Graphics 240,60,16,2
SeedRnd MilliSecs()

Global f_Time=CreateTimer(100)
Global n_Stream=CreateUDPStream(8979); //Wenn nicht auf Localhost getestet wird dann diesen Port-UDP oeffnen.

Const n_Connect=1
Const n_Leave=2
Const n_Position=3

Type n_User
   Field u_Name$
   Field u_Ip$
   Field u_Port
   Field u_X#
   Field u_Z#
   Field u_A#
End Type

Type n_Chat
   Field C_Msg
End Type

While Not KeyHit(1)
    WaitTimer(f_Time)
   If RecvUDPMsg(n_Stream)
      n_Ip$=UDPMsgIP(n_Stream)
      n_Port=UDPMsgPort(n_Stream)
      n_Type=ReadByte(n_Stream)
      Select n_Type
         Case n_Connect
             nU.n_User=New n_User
             u_Name$=ReadLine(n_Stream)
             nU\u_Name$=u_Name$
             nU\u_Ip$=n_Ip$
             nU\u_Port=n_Port
             For nU.n_User=Each n_User
                If Not nU\u_Port=n_Port
                     WriteByte n_Stream,n_Connect
                     WriteLine n_Stream,u_Name$
                   WriteByte n_Stream,n_Port
                   SendUDPMsg n_Stream,nU\u_Ip$,nU\u_Port
               EndIf
            Next   
               For nU.n_User=Each n_User
                If Not nU\u_Port=n_Port
                  WriteByte n_Stream,n_Connect
                     WriteLine n_Stream,nU\u_Name$
                   WriteByte n_Stream,nU\u_Port
                   SendUDPMsg n_Stream,n_Ip$,n_Port
               EndIf
            Next   
            DebugLog "Server: Connect -> "+u_Name$   
            Print "Server: Connect -> "+u_Name$      
         Case n_Leave
             For nU.n_User=Each n_User
                If Not nU\u_Port=n_Port 
                    WriteByte n_Stream,n_Leave
                   WriteByte n_Stream,n_Port
                   SendUDPMsg n_Stream,nU\u_Ip$,nU\u_Port   
               Else
                  DebugLog "Server: "+nU\u_Name$+" -> Leave"
                  Print "Server: "+nU\u_Name$+" -> Leave"
                   Delete nU
               EndIf
            Next   
         Case n_Position
            For nU.n_User=Each n_User
                If nU\u_Port=n_Port 
                  nU\u_X#=ReadFloat(n_Stream)
                  nU\u_Z#=ReadFloat(n_Stream)
                  nU\u_A#=ReadFloat(n_Stream)
                   Print "Server: "+nU\u_Name$+" -> Update"
               EndIf
            Next               
      End Select
   EndIf
    If MilliSecs()-s_Time>10
        For nU.n_User=Each n_User
            For nUn.n_User=Each n_User
                If nUn\u_Port<>nU\u_Port
                   WriteByte n_Stream,n_Position
                   WriteByte n_Stream,nU\u_Port
                   WriteFloat n_Stream,nU\u_X#
                   WriteFloat n_Stream,nU\u_Z#
                   WriteFloat n_Stream,nU\u_A#
                   SendUDPMsg n_Stream,nU\u_Ip$,nUn\u_Port
                End If
            Next
        Next
         s_Time=MilliSecs()
    End If
   Flip 0
Wend


Und nun mein Client:
Code: [AUSKLAPPEN]

AppTitle "Client"
Graphics3D 640,480,32,2
SeedRnd MilliSecs()

Global f_Time=CreateTimer(111)
Global n_Stream=CreateUDPStream(Rand(5999,9111))
Global n_Port=UDPStreamPort(n_Stream)
Global s_Ip$=HostIP(CountHostIPs("127.0.0.1")); // Oder die I-Net Ip auf diese der Client Connect soll.
Global s_Port=8979

Const n_Connect=1
Const n_Leave=2
Const n_Position=3

Type n_User
   Field U_Name$
   Field U_Port
   Field u_Entity%
   Field u_X#
   Field u_Z#
   Field u_A#
End Type

Type n_Chat
   Field C_Msg
End Type

n_Name$=Input("Username : ")
WriteByte n_Stream,n_Connect
WriteLine n_Stream,n_Name$
SendUDPMsg n_Stream,s_Ip$,s_Port

cPiv=CreatePivot()
Cube=CreateCube(cPiv)
PositionEntity Cube,0,1,0
EntityColor Cube,Rand(20,255),Rand(20,255),Rand(20,255)
Camera=CreateCamera(Cube)
PositionEntity Camera,0,5,-6
RotateEntity Camera,30,0,0

FcB_Red=Rand(0,255)
FcB_Green=Rand(0,255)
FcB_Blue=Rand(0,255)

CameraClsColor Camera,FcB_Red,FcB_Green,FcB_Blue
CameraFogMode Camera,1
CameraFogColor Camera,FcB_Red,FcB_Green,FcB_Blue
CameraFogRange Camera,0.1,100

Plane=CreatePlane()
Gitter=LoadTexture("Media\Gitter.bmp",2)
EntityTexture Plane,Gitter
EntityFX Plane,1

While Not KeyHit(1)
    WaitTimer(f_Time)
   Cls
   If RecvUDPMsg(n_Stream)
      n_Type=ReadByte(n_Stream)
      Select n_Type
         Case n_Connect
             nU.n_User=New n_User
             nU\u_Name$=ReadLine(n_Stream)
             nU\u_Port=ReadByte(n_Stream)
             nU\u_Entity%=CreateCube()
             PositionEntity nU\u_Entity%,0,1,0
             EntityColor nU\u_Entity%,Rand(0,255),Rand(0,255),Rand(0,255)
         Case n_Leave
             For nU.n_User=Each n_User
                If nU\u_Port=ReadByte(n_Stream)
                     FreeEntity nU\u_Entity%
                   Delete nU                  
               EndIf
            Next   
         Case n_Position
            For nU.n_User=Each n_User
                If nU\u_Port=ReadByte(n_Stream)
                  nU\u_X#=ReadFloat(n_Stream)
                  nU\u_Z#=ReadFloat(n_Stream)
                  nU\u_A#=ReadFloat(n_Stream)
               EndIf
            Next       
      End Select
   EndIf
    If KeyDown(200) Then MoveEntity cPiv,0,0,.2
    If KeyDown(208) Then MoveEntity cPiv,0,0,-.2
    If KeyDown(203) Then TurnEntity cPiv,0,1.8,0
    If KeyDown(205) Then TurnEntity cPiv,0,-1.8,0
    If MilliSecs( )-s_Time>10
        WriteByte n_Stream,n_Position
        WriteFloat n_Stream,EntityX#(cPiv)
        WriteFloat n_Stream,EntityZ#(cPiv)
        WriteFloat n_Stream,EntityYaw#(cPiv)
        SendUDPMsg n_Stream,s_Ip$,s_Port
        s_Time=MilliSecs()
    EndIf

   For nU.n_User=Each n_User
      If EntityInView(nU\u_Entity%,Camera)
          CameraProject(Camera,nU\u_X#,0,nU\u_Z#)
         PositionEntity nU\u_Entity%,nU\u_X#,1,nU\u_Z#
         RotateEntity nU\u_Entity%,0,nU\u_A#,0
      EndIf
   Next
   RenderWorld()
   UpdateWorld()
   For nU.n_User=Each n_User
      If EntityInView(nU\u_Entity%,Camera)
             CameraProject(Camera,nU\u_X#,0,nU\u_Z#)
             Color 255,255,255             
             Rect ProjectedX#()-10,ProjectedY#()-40,80,14,1
             Color 0,0,0             
             Text ProjectedX#()-10,ProjectedY#()-40,nU\u_Name$
        EndIf
    Next
   Flip 0
Wend
   
WriteByte n_Stream,n_Leave
SendUDPMsg n_Stream,s_Ip$,s_Port   


Die Datei Gitter.bmp gibt es hier (Erstellt das Verzeichnis Media und tuht in dieses die Datei):
user posted image

Bitte helft mir da ich nicht weis woran es liegen könnte da es bei localhost ohne
Probleme geht.

Ich entschuldige mich für die Rechtschreibfehler!

Vielen Dank schonmal für die Hilfen !
SYSTEMINFO: AMD Phenom 9850 Quad-Core Processor 2500 MHz||4 GB RAM ||MAINBOARD: ASUSTek M3N78-EM|| GRAFIK: NVIDIA GeForce 9600 GT
|| SERVER-HOMEPAGE: http://gamerxl.de/ [IM AUFBAU]
  • Zuletzt bearbeitet von Herox am Mi, Jun 03, 2009 18:30, insgesamt einmal bearbeitet

Starwar

BeitragFr, Mai 29, 2009 20:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,
Du solltest für Dateien TCP verwenden, da sonst Daten verloren gehen können.

Noch wetwas Standardlektüre:
http://blitzbasic.com/codearcs...?code=2263
http://blitzbasic.com/codearcs...?code=2261
MFG
 

Herox

BeitragFr, Mai 29, 2009 20:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich verwende deshalb UDP da dies die schnellere Variante ist und TCP ist zu langsarm es gehen zwar keine Daten bei TCP verloren aber für die übertragung der Position würde es das Programm zu stark bremsen.
Udp kann die Daten schneller versenden deswegen verwende ich es für die Position.
Eigentlich verzweifel ich da es beim Testen über Localhost funktioniert aber über INet nicht. Server erhält die Daten aber die anderen Clients erhalten sie nicht richtig.Und ich weiß nicht woran das Liegt.
Wenn ein Spieler Verbindung zum Server aufbaut funktioniert es ja auch . Aber wen man sich bewegt
bemerken die anderen Clients das nicht wenn man nicht Local testet.

Freue mich für weiter Hilfen zu diesem Problem und bedanke mich schonmal jetzt!
SYSTEMINFO: AMD Phenom 9850 Quad-Core Processor 2500 MHz||4 GB RAM ||MAINBOARD: ASUSTek M3N78-EM|| GRAFIK: NVIDIA GeForce 9600 GT
|| SERVER-HOMEPAGE: http://gamerxl.de/ [IM AUFBAU]
  • Zuletzt bearbeitet von Herox am Mi, Jun 03, 2009 18:31, insgesamt einmal bearbeitet

Holzchopf

Meisterpacker

BeitragFr, Mai 29, 2009 21:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Vom Servercode: Code: [AUSKLAPPEN]
SendUDPMsg n_Stream,nU\u_Ip$,nUn\u_Port


Müsstest du die Nachricht nicht eher an nUn\u_IP$ schicken?

btw: Ich empfehle dir, übersichtlichere Variablennamen anzugewöhnen Wink

mfG
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm
 

Herox

BeitragSa, Mai 30, 2009 11:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Oh ja stimmt war mir wohl ein kleiner fehler unterlaufen.

Vielen Dank Holzchopf!
SYSTEMINFO: AMD Phenom 9850 Quad-Core Processor 2500 MHz||4 GB RAM ||MAINBOARD: ASUSTek M3N78-EM|| GRAFIK: NVIDIA GeForce 9600 GT
|| SERVER-HOMEPAGE: http://gamerxl.de/ [IM AUFBAU]
  • Zuletzt bearbeitet von Herox am Mi, Jun 03, 2009 18:31, insgesamt einmal bearbeitet

Tankbuster

BeitragSa, Mai 30, 2009 15:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Aber die IP muss im Integer-Format sein, also ein String wie "217.32.2.88" geht natürlich nicht. Nurmal so als Info wegen Zitat:
SendUDPMsg n_Stream,nU\u_Ip$,nUn\u_Port
Twitter
Download Jewel Snake!
Windows|Android

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group