UDP - Wie kann ich empfangene Bytes Variablen zuordnen?!
Übersicht

AldiBetreff: UDP - Wie kann ich empfangene Bytes Variablen zuordnen?! |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
||
ApocalypticBetreff: Re: UDP - Wie kann ich empfangene Bytes Variablen zuordnen?! |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 !!! |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Dann kämen wir zu einer UDP-DirectPlay Version. Aber trotzdem guter Vorschlag.
Aldi |
||
![]() |
Jolinah |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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. ![]() Aldi |
||
Aldi |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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... ![]() |
||
![]() |
hamZtaAdministrator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 !!! |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Evtl. arbeiten die mit Checksummen.
Das wird dann Blockweise geprüft. |
||
antome |
Aldi |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
hmm... | ||
![]() |
Jolinah |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
Aldi |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Doch, doch, das wäre logisch. Du hast recht.
thx, Aldi ![]() |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group