AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Konzept: Netzwerkprotokoll
Thema durchsuchen
Ansicht
Themen-Optionen

Konzept: Netzwerkprotokoll

Offene Frage von "BUG"
Ein Thema von Zacherl · begonnen am 18. Sep 2012 · letzter Beitrag vom 25. Sep 2012
 
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#7

AW: Konzept: Netzwerkprotokoll

  Alt 19. Sep 2012, 15:56
Habe noch bis früh heute morgen am Protokoll gearbeitet und einige Ideen von hier wieder verworfen, geändert oder neue Sachen hinzugefügt. Das Senden und Empfangen ansich funktioniert nun schon überraschend gut. Fehlen nur noch einige Events, das automatische Sammeln der Daten, ein paar Fehlerkorrekturen und ausführliche Tests.

Meine Hauptpakete sind folgende:
Delphi-Quellcode:
type
  TdxIDTPPacketType = (
    ptTransferInfo = 1,
    ptTransferData = 2,
    ptTransferStateChanged = 3,
    ptTransferStateCommand = 4
  );
  
  TdxIDTPMainHeader = packed record
    TransferID: Word;
    PacketSize: Word;
    PacketType: TdxIDTPPacketType;
  end;

  // Diesem Paket folgen direkt die Meta Daten, fals vorhanden
  PdxIDTP1Packet = ^TdxIDTP1Packet;
  TdxIDTP1Packet = packed record
    Magic: DWord;
    MetaSize: Word;
    DataSize: UInt64;
    BlockSize: TdxIDTPBlockSize;
    Priority: Boolean;
    Encrypted: Boolean;
    Compressed: Boolean;
  end;

  PdxIDTP2Packet = ^TdxIDTP2Packet;
  TdxIDTP2Packet = packed record
    Magic: DWord;
    TransferState: TdxIDTPTransferState;
    Reason: TdxIDTPTransferStateChangeReason;
  end;
Der Main Header enthält wie vorher die ID der Übertragung, die aktuelle Blockgröße und den Typ der folgenden Daten.
ptTransferInfo ist praktisch das Initialisierungspaket für einen neuen Transfer. Es enthält das TdxIDTP1Packet gefolgt von eventuellen Meta Daten. Der Empfänger reagiert auf das Paket, indem es ein neues Transfer Objekt anlegt und in der LookupTable einträgt
ptTransferData enthält jeweils einen Datenblock eines Transfers. Der Empfänger prüft, ob der Transfer in der LookupTable vorhanden ist und akkumuliert die Daten. Wenn die TransferID nicht existiert, wird das Paket schlicht und einfach verworfen.
ptTransferStateChanged wird vom Sender geschickt, wenn der User eine Übertragung pausiert, fortsetzt oder abbricht. Der Empfänger ändert auf seiner Seite dann ebenfalls den Status des Transfers. Wenn die TransferID nicht existiert, wird auch hier das Paket einfach verworfen.
ptTransferStateCommand wird vom Empfänger an den Sender geschickt, wenn der User eine Übertragung pausiert, fortsetzt oder abbricht. Der Sender antwortet darauf mit einem ptTransferStateChanged Packet.

Das Magic Feld in den Control Paketen beinhaltet einen festen Wert, welcher nach der Entschlüsselung geprüft wird. Ist der Wert falsch, kann davon ausgegangen werden, dass unterschiedliche Verschlüsselungroutinen oder Schlüssel zum Einsatz kommen. Die Pakete werden dann auf Seite des Empfängers verworfen (hier könnte man sich eventuell noch etwas überlegen, um den Sender zu informieren).

Die Ping Pong Variante beim Start eines Transfers habe ich komplett verworfen. Ausgehend davon, dass die LookupTabelle auf Sender und Empfängerseite eigentlich immer synchronisiert sein sollte, kann der Sender bereits feststellen, ob bereits 2^16 Transfers laufen. Die Funktion zum Ermitteln der nächsten freien TransferID ist folgender:
Delphi-Quellcode:
function TdxIDTPIOHandler.SearchNextTransferID(var TransferID: Word): Boolean;
var
  I: Word;
begin
  Result := false;
  if (FLastTransferID = MAXWORD) then FLastTransferID := 0;
  for I := FLastTransferID to High(FOLookupTable) do
  begin
    if not Assigned(FOLookupTable[I]) then
    begin
      TransferID := I;
      Result := true;
      FLastTransferID := TransferID;
      Exit;
    end;
  end;
  for I := Low(FOLookupTable) to FLastTransferID do
  begin
    if not Assigned(FOLookupTable[I]) then
    begin
      TransferID := I;
      Result := true;
      FLastTransferID := TransferID;
      Break;
    end;
  end;
end;
Schlägt die Funktion fehl, wird eine Exception geschmissen.

Was sagt ihr zur bisherigen Umsetzung? Auf den ersten Blick scheint mir das Protokoll recht stabil zu funktionieren. Seht ihr noch irgendwelche Sachen, die extrem umgeschickt gelöst sind?
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
 


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 03:49 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