Zitat von
BlackJack:
Zitat von
Muetze1:
(Tipp: Schau dir die Eigenschaft Data der TCustomWinSockets an).
hmm so wie ich das in der hilfe verstehe zeigt Data auf einen Block, der Infos zu der jeweiligen Socketverbindung speichert. allerdings steht in der Delphi-hilfe sonst nicht viel dazu, wo kann man da denn mehr erfahren?
Ist genauso wie die Data Eigenschaft der TreeNodes oder die Tag Eigenschaft der Komponenten eine ungenutzte Eigenschaft die mitgeführt wird. Du kannst die Daten selber belegen. Somit kannst du im ClientConnect einen TMemoryStream anlegen und dessen Instanz in der Data Eigenschaft des Sockets vermerken und hast ihn somit immer sofort zur Verfügung.
Zitat von
BlackJack:
solle das dann nicht so aussehen: Socket.ReceiveBuf(Pointer(Integer(MemoryStream.Memory) + OldSize)^, Socket.ReceiveLength);
weil so wie ich das verstanden habe zeigt Memory auf den Anfang der Daten, aber ich will ja ans Ende anhängen.
Ja, du hast vollkommen Recht, ich ging in meinem jugendlichen Leichtsinn fälschlicherweise davon aus, dass er Memory anpasst, abhängig von Position, aber dem ist nicht so.
Zitat von
BlackJack:
dann müssten aber auch wieder die Methoden zum Auslesen aus dem MemoryStream bescheid wissen, welche Kommandos es gibt und welche falsch sind. Ich wollte es eigentlich so machen, dass ich ne Funktion hab, die das Kommando ausliest (vorher Kennung checken etc) und die eventuell folgenden Daten mit zurückgibt. und die aufrufende Methode bekommt dann halt das Kommando und muss selber entscheiden, ob sie was damit anfangen kann.
Warum? Die Methode kann das Kommando und den Datenblock als Pointer auslesen und zurück geben. Wenn es kein Datenblock gibt, dann gibt es ein Nil zurück. Ob es einen Datenblock gibt, erkennt die Funktion unabhängig davon welches Kommando es ist, wenn die Gesamtlänge grösser als die Kommandolänge ist (plus 1, für das Byte der Kommandolänge). Ob das Kommando nun bekannt ist, das kannst du auch ausserhalb regeln und deine Funktion kannst du so schreiben - ohne das sie näheres Wissen.
Zitat von
BlackJack:
und kann man das so machen dass nach dem Auslesen aus dem MemoryStream alles rigoros relöscht wird, was nicht mit "lrt" beginnt?
Wenn du am Anfang einen Block hast, der nicht mit "lrt" beginnt, dann wurde zuviel oder zu wenig gesendet/ausgelesen. Daher müsstest du neu synchronisieren - also so lange auslesen bis du ein "lrt" findest. Aber rigeros löschen nicht, da du schon wieder Teile des nachfolgenden Blockes in dem MemoryStream haben kannst.
Zitat von
BlackJack:
(apropos: wie löscht man am schlauesten die ersten n bytes aus dem MemoryStream, ohne die gesamten restlichen Daten kopieren zu müssen?)
Kenne ich keine Methode, daher CopyFrom() und die Size Eigenschaft setzen.