AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi TIdTCPServer Byte Packets (Indy10)
Thema durchsuchen
Ansicht
Themen-Optionen

TIdTCPServer Byte Packets (Indy10)

Ein Thema von DArc · begonnen am 9. Okt 2011 · letzter Beitrag vom 30. Okt 2011
Antwort Antwort
DArc

Registriert seit: 3. Jun 2009
48 Beiträge
 
Delphi 7 Enterprise
 
#1

AW: TIdTCPServer Byte Packets (Indy10)

  Alt 11. Okt 2011, 16:12
ich habe jetzt aber ein problem mit dem auslesen des packets ...

Delphi-Quellcode:
procedure TForm1.ServerExecute(AContext: TIdContext);
type
  TMyPacket = packed record
    id: Byte;
    length: Byte;
    username: array[0..15] of AnsiChar;
    {
    int0: integer;
    long0: Longint;
    int1: integer;
    nbyte0: byte;
    nbyte1: byte;
    nbyte2: byte;
    nbyte3: byte;
    }

  end;
var ByteBuffer: TIdBytes;
begin
  AContext.Connection.IOHandler.ReadBytes(ByteBuffer, SizeOf(tmypacket));
  BytesToRaw(ByteBuffer, mypacket, SizeOf(tmypacket));
end;
nehmen wir mal ein ganz leichtes beispiel, also das mit dem kleinsten packet:
ich empfange: id (byte), length of username (byte), username (string)
sample: id=0x02(login packet), length of username=1, weil username=77(Zeichen "M" als ASCII-Code)

ich gebe das ganze mit folgendem code aus:
Delphi-Quellcode:
  Log.Lines.Add(IntToStr(mypacket.id));
  Log.Lines.Add(IntToStr(mypacket.length));
aus dem beispielcode resultiert folgendes:
Code:
2
0
1
0
77
0
heißt: ich konnte zwar die bytes auslesen, jedoch landen die alle im mypacket.id und für length ist nix mehr übrig, geschweige denn für username

achja ehe ich es vergesse:
ich empfange überhaupt nichts, solange ich in dieser zeile SizeOf(TMyPacket) stehen habe ...
Delphi-Quellcode:
// ...
AContext.Connection.IOHandler.ReadBytes(ByteBuffer, SizeOf(tmypacket));
// ...
bei mir steht ne zahl drin (irrelevant welche, hauptsache: zahl<=byte, im prinzip logisch da ich immer nur ein byte empfange), kurz:
Delphi-Quellcode:
// ...
AContext.Connection.IOHandler.ReadBytes(ByteBuffer, SizeOf(byte));
// ...
meine fragen noch kurz zusammengefasst:
warum kann ich mein Record nicht vollständig füllen?
warum empfange ich keine werte bei SizeOf(TMyPacket)?

Mfg DArc
Ich würde gerne die Welt verändern, doch Gott hat
vergessen mir die Quellcodes zu geben ... !

Geändert von DArc (11. Okt 2011 um 16:16 Uhr)
  Mit Zitat antworten Zitat
DArc

Registriert seit: 3. Jun 2009
48 Beiträge
 
Delphi 7 Enterprise
 
#2

AW: TIdTCPServer Byte Packets (Indy10)

  Alt 16. Okt 2011, 22:11
niemand ne idee?
Ich würde gerne die Welt verändern, doch Gott hat
vergessen mir die Quellcodes zu geben ... !
  Mit Zitat antworten Zitat
FredlFesl

Registriert seit: 19. Apr 2011
293 Beiträge
 
Delphi 2009 Enterprise
 
#3

AW: TIdTCPServer Byte Packets (Indy10)

  Alt 17. Okt 2011, 06:46
Was mich ein wenig stutzig macht, ist diese Zeile
Code:
Total Size:    23 bytes + [u]length of strings[/u]
Ist das nun ein Record mit einer festen Größe oder nicht?

Weiterhin solltest Du dir die Deklaration genauer anschauen, ich seh da nämlich nichts von 'Byte' bei der 'ID'...
Das Bild hängt schief.

Geändert von FredlFesl (17. Okt 2011 um 06:50 Uhr)
  Mit Zitat antworten Zitat
DArc

Registriert seit: 3. Jun 2009
48 Beiträge
 
Delphi 7 Enterprise
 
#4

AW: TIdTCPServer Byte Packets (Indy10)

  Alt 17. Okt 2011, 15:32
danke erst mal für die antwort, schön zu sehen, dass es leute gibt die früh morgens antworten
nehmen wir das beispiel, welches ich im letzten post behandelt habe:
http://mc.kev009.com/Protocol#Handshake_.280x02.29

Weiter oben steht die Definition der "Packets"
Code:
All packets begin with a single "Packet ID" byte. Listed packet size includes this byte. Packets are either "server to client", "client to server", or both. If not specified, assume that the packet can be sent both ways. There is no "length" field; for variable length packets, you must parse to the end to determine the length.
Die Länge des Packets, welches geschickt wird:
Code:
Total Size:    3 bytes + length of strings
soll (glaube ich mal) heißen, dass ich min. 3 bytes zugeschickt bekomme (spekuliere auf benutzername min. 1 zeichen):
1. byte: packet id
2. byte: länge der zeichenkette (länge des benutzernamens)
3. byte: das zeichen selbst

habe ich zB den Namen DArc, empfange ich folgendes (3 Bytes + 3 weitere):
1. byte: packet id = 0x02 => 2
2. byte: länge meines namens = 4
3. byte: das zeichen "D" im ASCII Code
4. byte: das zeichen "A"
5. "r"
6. "c"

zum hinweis auf nicht vorhandene deklaration, ich hab doch in meinem Record folgendes:
Delphi-Quellcode:
  TMyPacket = packed record
    id: Byte;
    length: Byte;
    username: array[0..15] of AnsiChar; // bzw. of Byte
  end;
€dit: wenn ich etwas auf der Protocol Dokumentationsseite falsch entnommen, interpretiert oder überlesen habe, so
bitte ich um verständnis und um korrektur
Ich würde gerne die Welt verändern, doch Gott hat
vergessen mir die Quellcodes zu geben ... !

Geändert von DArc (17. Okt 2011 um 15:34 Uhr)
  Mit Zitat antworten Zitat
DArc

Registriert seit: 3. Jun 2009
48 Beiträge
 
Delphi 7 Enterprise
 
#5

AW: TIdTCPServer Byte Packets (Indy10)

  Alt 29. Okt 2011, 12:13
kommt niemand drauf?
Ich würde gerne die Welt verändern, doch Gott hat
vergessen mir die Quellcodes zu geben ... !
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.782 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: TIdTCPServer Byte Packets (Indy10)

  Alt 29. Okt 2011, 16:17
Code:
All packets begin with a single "Packet ID" byte. Listed packet size includes this byte. Packets are either "server to client", "client to server", or both. If not specified, assume that the packet can be sent both ways. There is no "length" field; for variable length packets, you must parse to the end to determine the length.
Wenn ich das richtig interpretiere:

Paketaufbau:
Id - Byte
Size - Byte
Data - Array of char

Size beinhaltet die Gesamtlänge des Paketes.
Wenn DArc übertragen wird sollte Size dann 6 sein.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
DArc

Registriert seit: 3. Jun 2009
48 Beiträge
 
Delphi 7 Enterprise
 
#7

AW: TIdTCPServer Byte Packets (Indy10)

  Alt 30. Okt 2011, 16:59
Ich denke so weit war ich schon, siehe eine antwort früher ...

habe ich zB den Namen DArc, empfange ich folgendes (3 Bytes + 3 weitere):
1. byte: packet id = 0x02 => 2
2. byte: länge meines namens = 4
3. byte: das zeichen "D" im ASCII Code
4. byte: das zeichen "A"
5. "r"
6. "c"

Delphi-Quellcode:
  TMyPacket = packed record
    id: Byte;
    length: Byte;
    username: array[0..15] of AnsiChar; // bzw. of Byte
  end;
mein problem ist immer noch wie beschrieben ...
Ich würde gerne die Welt verändern, doch Gott hat
vergessen mir die Quellcodes zu geben ... !
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.388 Beiträge
 
Delphi 12 Athens
 
#8

AW: TIdTCPServer Byte Packets (Indy10)

  Alt 30. Okt 2011, 17:26
Tja, die Packages gehen nunmal nicht so als "ein" Package raus.
Kleinere werden von Indy gerne mal zusammengefasst, was auch nicht unbedingt schlecht ist und alles was größer als soein TCP-Packet ist, wird nunmal aufgeteilt.

Du kannst also im Server nur erstmal stur versuchen das Längenbyte zu lesen, und dann die entsprechende Anzahl an Datenbytes.
Wenn du nicht blockierend lesen willst, dann wirst du haöt bis zum Eintreffen des nächsten/übernächsten/... Datenblocks warten müssen, bis das dann vollständig vorhanden und verarbeitbar ist.

Oder man speichert sich alles Unvollständige, hängt die neuen Daten an, verarbeitet dann so weit, wie möglich und merkt sich den rest wieder, bis der nächste Block ankommt.


PS:
Delphi-Quellcode:
TMyPacket = packed record
  id: Byte;
  length: Byte;
  username: array[0..15] of AnsiChar;
end;

// entspricht zufällig
TMyPacket = packed record
  id: Byte;
  username: String[16]; // das ist ein ShortString, die sind immer ANSI und mit einem vorangestellen Längenbyte
end;
Ein Problem, welches du bekommen könntest: Abgebrochene/fehlerhafte Übertragungen, wo dann eine Lücke entsteht und du eventuell nicht mehr dan Anfang der Datenblöcke findest ... dafür könnte man sich z.B. noch eine Startsequenz/-signaur einbauen.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (30. Okt 2011 um 17:29 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#9

AW: TIdTCPServer Byte Packets (Indy10)

  Alt 30. Okt 2011, 18:09
Ein Problem, welches du bekommen könntest: Abgebrochene/fehlerhafte Übertragungen, wo dann eine Lücke entsteht und du eventuell nicht mehr dan Anfang der Datenblöcke findest ... dafür könnte man sich z.B. noch eine Startsequenz/-signaur einbauen.
Echt?
Ich dachte mir, TCP regelt fehlerhafte Übertragungen.
=P
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:19 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz