Wie am besten Daten über UDP übertragen?

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

barratator

Betreff: Wie am besten Daten über UDP übertragen?

BeitragFr, Dez 26, 2008 23:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
ich habe zurzeit ein (hoffentlich) kleines Problem mit der Kommunikation per UDP.
Mein Programm sieht so aus:

Server
- TCP-Server
- UDP Stream zum empfangen von Daten
- UDP Stream zum versenden von Daten

Client A:
- TCP Verbindung an den Server
- UDP Stream zum empfangen von Daten
- UDP Stream zum versenden von Daten

Client B:
- TCP Verbindung an den Server
- UDP Stream zum empfangen von Daten
- UDP Stream zum versenden von Daten

-Über TCP werden die "wichtigen" Daten verschickt, die aufjedenfall ankommen müssen.
-Über UDP werden die Daten verschickt, die sich x-mal pro Sekunde ändern (Koordinaten von Spielern, usw.)

Im Abstand von 50ms sendet der Client A seine UDP-Daten über den Stream zum Server, welcher dies dann an Client B (C,D,E,...) weitergibt. Das Problem ist jedoch, dass sich alles "aufstaut" wie man es eigentlich nur von TCP kennt.
D.h. Wenn ich bei Client A laufe wird alles anfangs in Echtzeit an B übertragen und gerendert, jedoch nach ein paar Sekunden gibt es eine verzögerung, bis alles schließlich x-Sekunden später erst ankommt.

Was mache ich dort falsch? Ich bin komplett ratlos Sad


Danke im Vorraus und noch schöne Weihnachten und einen guten Rutsch ins neue Jahr Smile


Gruß
Bastian

Nova

BeitragSa, Dez 27, 2008 0:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie wärs wenn du uns den Code zeigst der das Problem verursacht? Hellsehen können wir (noch?) nicht. Wink
AMD Athlon II 4x3,1GHz, 8GB Ram DDR3, ATI Radeon HD 6870, Win 7 64bit
 

barratator

BeitragSa, Dez 27, 2008 11:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für die Antwort Smile
Hier ist mal ein stark gekürzter Code:

Server
Code: [AUSKLAPPEN]

udp1 = CreateUDPStream(1000)  ; in
udp2 = CreateUDPStream(1001)  ; out

ip = INT_IP2("127.0.0.1")

Repeat
  If RecvUDPMsg(udp1) <> 0 Then
    x = ReadShort(udp1)
    y = ReadShort(udp1)
    WriteShort udp2,x
    WriteShort udp2,y
    SendUDPMsg udp2,ip,1003
  EndIf
  Delay 5
Until KeyHit(1)


Function INT_IP2(ip$)
  p1=Instr(ip$,"."):p2=Instr(ip$,".",p1+1):p3=Instr(ip$,".",p2+1)
  Return (Int(Mid(ip$,1,p1))*16777216)+(Int(Mid(ip$,p1+1,p2-p1))*65536)+(Int(Mid(ip$,p2+1,p3-p2))*256)+Int(Mid(ip$,p3+1,-1))
End Function


Client A
Code: [AUSKLAPPEN]

udp1 = CreateUDPStream(1002)  ; out

x = 200
y = 200
ms = MilliSecs()
ip = INT_IP2("127.0.0.1")

Graphics 800,600,0,2
SetBuffer BackBuffer()

Repeat
  If MilliSecs()-ms => 50 Then
    WriteShort udp1,x
    WriteShort udp1,y
    SendUDPMsg udp1,ip,1000
  EndIf
  If KeyDown(200) Then y=y-1
  If KeyDown(208) Then y=y+1
  If KeyDown(203) Then x=x-1
  If KeyDown(205) Then x=x+1

  Cls
  Plot x,y
  Flip
  Delay 5
Until KeyHit(1)

Function INT_IP2(ip$)
  p1=Instr(ip$,"."):p2=Instr(ip$,".",p1+1):p3=Instr(ip$,".",p2+1)
  Return (Int(Mid(ip$,1,p1))*16777216)+(Int(Mid(ip$,p1+1,p2-p1))*65536)+(Int(Mid(ip$,p2+1,p3-p2))*256)+Int(Mid(ip$,p3+1,-1))
End Function


Client B
Code: [AUSKLAPPEN]

udp1 = CreateUDPStream(1003)  ; in

x = 0
y = 0

Graphics 800,600,0,2
SetBuffer BackBuffer()

Repeat
  If RecvUDPMsg(udp1) <> 0 Then
    x = ReadShort(udp1)
    y = ReadShort(udp1)
  EndIf

  Cls
  Plot x,y
  Flip
  Delay 5
Until KeyHit(1)


Ich habe bereits rausgefunden, dass alles besser läuft, wenn man Delay bei allen 3 höher setzt (ab 20 läuft alles zimlich gut), aber das würde den Ablauf vom Rest zimlich stören Sad


Danke für die Hilfe im vorraus Smile

Gruß
Bastian

The_Nici

BeitragSa, Dez 27, 2008 12:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Lass am besten Delay ganz raus und nimm Timer.
CreateTimer WaitTimer FreeTimer
 

barratator

BeitragSa, Dez 27, 2008 13:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok Smile
Ich habe jetzt bei allen 3 Programmen einen Timer mit 50FPS eingerichtet...Es hat aber immernoch eine enorme verzögerung Sad


Gruß
Bastian


EDIT: Wär' es vielleicht sinnvoll,, dass der Client dem Server nur immer sagt, dass eine Taste gedrückt wurde (z.b. Nach-Links-Taste wurde gedrückt/losgelassen) und dass der Server dann alles berechnet und alles weitergibt?

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group