Zitat von
BlackJack:
also quasi ne Warteschlange? jo ich glaube das ist ne gute idee, so werde ich das mal versuchen.
Joa, genau. Die nimmt alles auf was ankommt und immer wenn was hinzukommt, kannst du ja anhand deines Protokolls nachschauen ob du alles hast oder halt noch weiter warten musst.
Zitat von
BlackJack:
aber dann kann ich mir ja auch die eigene Methode zum Empfangen (ReceiveData) sparen, oder?
Ja, die hättest du so oder so extra bauen können und eigentlich auch direkt in die jeweils zugewiesene Methode. Vor allem nun hast du auf der Serverseite die Verwaltung der MemoryStreams pro Client noch zusätzlich (Tipp: Schau dir die Eigenschaft Data der TCustomWinSockets an).
Zitat von
BlackJack:
weil wenn ich im OnRead einfach mit ReceiveText auslese, dann gibt er mit doch automatisch alles zurück, was der Socket grade vorliegen hat, und das kann dann einfach an die Warteschleife anhängt werden.
Grundlegend richtig, aber in den Umsetzung zweifelhaft, da du mit TJob einen Record überträgst und somit würde dein String bei einem enthaltenen Nullbyte enden. Daher: Übertragung vom Socket in den TMemoryStream am besten immer mit ReceiveBuff und WriteBuffer. Andere Möglichkeit die mir hier gerade dabei einfällt:
Delphi-Quellcode:
procedure OnReceive:
begin
MemoryStream.Position := MemoryStream.Size;
MemoryStream.Size := MemoryStream.Size + Socket.ReceiveLength;
Socket.ReceiveBuf(MemoryStream.Memory^, Socket.ReceiveLength);
End;
Gerade eingefallen - so spart man sich den Zwischenpuffer und das doppelte kopieren.
Zitat von
BlackJack:
und ist damit dann nicht auch automatisch das Thread-Problem, das du beschrieben hast, gelöst?
Jupp!
Zitat von
BlackJack:
edit:
ach ja was haltet ihr von folgendem "Protkoll" für den austausch von Nachrichten/daten:
"lrt" ; 1 Byte für die Länge des Kommandos ; Kommandostring ; 4 Bytes für die Länge der eventuell folgenden Daten.
Wie wäre es einfach nach der Kennung (die du später zum neu-synchronisieren verwenden kannst) 4 Bytes zu senden mit der Gesamtlänge? Dann könnte nämlich Server sowie Client bei unbekannten Kommandos diese überspringen - weil er zwar nicht weiss wie er sie handeln kann, aber überspringen kann er sie, da er ihre Gesamtlänge kennt.
"lrt"; 4 Bytes Gesamtlänge; 1 Byte Kommandolänge; Kommando; <abhängig vom Kommando>4 Byte Datenlänge; Daten</abhängig vom Kommando>