UDP - Wie kann ich empfangene Bytes Variablen zuordnen?!

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Aldi

Betreff: UDP - Wie kann ich empfangene Bytes Variablen zuordnen?!

BeitragFr, März 10, 2006 19:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

ich bin grad an einem Spiel, mit dem ich mal ein bisschen was übers Netz machen will. Ich will nur 3 Variablen übers Netz versenden bzw. empfangen. Jedenfalls frag ich mich: Wie soll das Programm wissen, ob das Byte, das es gerade Empfangen hat, Variable x, y, oder z zuzuordnen ist?!
Vielleicht kapier ich das einfach nicht, habe n Brett vorm Kopp oder.. bin einfach zu blöd dafür. Trotzdem freue ich mich über eine Erklärung.

Aldi
 

ke^kx

BeitragFr, März 10, 2006 20:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Sende einfach alle Variablen in einem String und trenne sie nur durch ein komma oder so. Dann weißt du: aha, der erste Wert ist x, der zweite y, und der dritte z.

Helfen kann dir dabei dieser (nicht von mir stammende Wink ) Code:
Code: [AUSKLAPPEN]
;---------------------------------------------------
; SPLITS A STRING INTO FRAGMENTS, USING A SPLIT
; CHARACTER AND RETURNS A SPECIFIED SEGMENT
; SECTION = FRAGMENT TO RETURN (0 - ...) -1 FOR LAST
;---------------------------------------------------
Function Str_Explode$(txt$, divider$, section%)

   Local sec% = 0
   Local tmp$ = ""
   Local sections% = 0
   
   ; COUNT FRAGMENTS
   For i% = 1 To Len(txt$)
      If Mid(txt$,i,1) = divider$ Then sections = sections + 1
   Next

   ; RETURN LAST FRAGMENT?
   If section = -1 Then section = sections
   
   For i% = 1 To Len(txt$)
      char$    = Mid(txt$,i,1)
      If char$ = divider$ Then sec = sec + 1 : i = i + 1 : char$ = Mid(txt$,i,1)
      If sec   = section  Then tmp$ = tmp$ + char$
   Next
   
   Return tmp$

End Function


Jiriki
http://i3u8.blogspot.com
Asus Striker II
Intel Core2Quad Q9300 @ 2,5 GHz (aber nur zwei Kerne aktiv aufgrund der Instabilität -.-)
Geforce 9800 GTX
2GB RAM
 

Aldi

BeitragFr, März 10, 2006 21:34
Antworten mit Zitat
Benutzer-Profile anzeigen
thx, aber z.B. im UDP Beispiel von Rene Meyer, da sendet der auch einfach erst x und dann y. Und liest auch einfach erst x und dann y ein. Aber ich versende nicht x, dann y, dann z, sondern unregelmäßig. Und es muss doch möglich sein, dass man... weiß... was zu welcher Variable gehört. Ohne zusammenpackung in einen String. Außerdem wird da sowieso nur unnötig Bytes verbraucht, denn ich will nur veränderungen senden, keine Dauersendung der x/y Positionen.

Aldi
 

Apocalyptic

Betreff: Re: UDP - Wie kann ich empfangene Bytes Variablen zuordnen?!

BeitragFr, März 10, 2006 21:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Aldi hat Folgendes geschrieben:
Wie soll das Programm wissen, ob das Byte, das es gerade Empfangen hat, Variable x, y, oder z zuzuordnen ist?!


Indem du das Byte nicht einzeln sendest, sondern an den Anfang noch ein Byte hinhängst, dass deinem Programm sagt, um was es sich handelt.
Suum cuique

[ www.ffs-net.de.vu ] [ Raycaster ]
 

antome

!!! gesperrt !!!

BeitragFr, März 10, 2006 21:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich könnte mit vorstellen das man dann sogenannte Steuervariablen sendet

zum Beispiel
bevor Variable X gesendet wird sende ich 112
bevor Y gesendet wird sende ich 113

wenn nun dein Programm 113 empfängt weiß es das die nächste Variable Y ist.

Im Bytebereich allerdings schwierig da nur von 0-255, wenn der gesammte Bereich für X,Y oder Z benötigt wird muss man 2 Steuerbytes hintereinander senden um das zu trennen.

Also 100 und danach entweder 112 oder 113 ... oder so ähnlich

Im Integerbereich wäre das einfacher, aber ich habe mich selbst mit Übertragungen übers Netz noch nicht beschäftigt da man entweder immer die IP bekanntmachen muss oder einen Server benötigt. (Falls ich mich irre bitte berichtigen)
antome
 

Aldi

BeitragFr, März 10, 2006 21:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Dann kämen wir zu einer UDP-DirectPlay Version. Aber trotzdem guter Vorschlag.

Aldi

Jolinah

BeitragFr, März 10, 2006 22:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Kleines Beispiel:

Code: [AUSKLAPPEN]

Const MSG_XPOS = 1
Const MSG_YPOS = 2
Const MSG_YPOS = 3

...
;Empfangen

msg = ReadByte(stream)

Select msg

  Case MSG_XPOS
    x = ReadByte(stream)

  Case MSG_YPOS
    y = ReadByte(stream)

  Case MSG_ZPOS
    z = ReadByte(stream)

End Select

...
;Senden
WriteByte(stream, MSG_XPOS)
WriteByte(stream, x)

WriteByte(stream, MSG_YPOS)
WriteByte(stream, y)

...
 

Aldi

BeitragSa, März 11, 2006 0:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Stimmt. Gutes Beispiel. Aber können bei UDP-Übertragungen nicht Daten verloren gehen? Wenn dann auch nur eine Nachricht nicht ankommt(z.B, X_POS, kann man das darauffolgende Byte nicht mehr zuordnen. Aber in meinem Fall wäre das nicht so schlimm, wenn jedes 100tste Byte verloren ginge... Jedenfalls... Danke für die Antworten. Very Happy

Aldi
 

Aldi

BeitragSa, März 11, 2006 13:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Obwohl, wartet mal. Z.B im Beispiel von Rene Meyer. Da wird das auch nicht gemacht. x und y werden konsequent immer abgefragt. Es wird in der Reihenfolge
xyxyxyxyxyxyxy...
gesendet. Und in der Reihenfolge
xyxyxyxyxyxy... den empfangenen Werten Variablen zugeordnet. Was jedoch geschieht, wenn z.B. ein x auf der Reise verloren geht? dann kommt zwischendurch
xyyxy... an. aber der Wert wird einem x zugeordnet. Wenn das passieren würde, wären von da an alle Werte vertauscht, d.h. Werte, die für x gedacht sind werden y zugeordnet und umgekehrt. Und ich kann mir nicht vorstellen, dass Shooter wie UT oder so vor jedem Byte ein Byte mit einer Typuszahl einfügen... Confused

hamZta

Administrator

BeitragSa, März 11, 2006 13:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Dann musst du wohl Kontrollen einbauen, die schauen ob auch wirklich ein Wert für die Variable angekommen ist. Wenn nicht, einfach nochmal anfordern.
Blog.
 

antome

!!! gesperrt !!!

BeitragSa, März 11, 2006 13:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Evtl. arbeiten die mit Checksummen.
Das wird dann Blockweise geprüft.
antome
 

Aldi

BeitragSa, März 11, 2006 15:51
Antworten mit Zitat
Benutzer-Profile anzeigen
hmm...

Jolinah

BeitragSa, März 11, 2006 16:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Mach dir wegen verlorenen Daten nicht zu grosse Sorgen, das tritt ja eher selten auf. Wenn ich das richtig verstanden habe wird ja alles in Paketen geschickt, diese Pakete haben den IP header usw. und einen Datenblock. Wenn etwas verloren geht, dann das ganze Paket. Das heisst wenn dein Paket 2 Bytes gross ist (vom Datenbereich her gesehen) mit 1 Steuerbyte und 1 Wertbyte, dann werden diese nie voneinander getrennt. Entweder kommt das ganze Paket an, oder es geht eben das ganze Paket verloren.

Die Frage ist natürlich wie das Blitz nun genau macht. Vielleicht wird für jedes Byte ein einzelnes Datenpaket erstellt.. Dann gäbe es aber die Möglichkeit 4 Bytes in einen Integer zu packen und WriteInt zu benutzen.

Falls das Quatsch ist korrigiert mich bitte Wink
 

Aldi

BeitragSa, März 11, 2006 19:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Doch, doch, das wäre logisch. Du hast recht.
thx, Aldi Smile

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group