![]() |
"Cache" von Sockets löschen
Hallo,
ich habe folgendes Problem: Die Socket Komponenten haben die (nervende) Eigenschaft, dass sie, wenn man
Delphi-Quellcode:
schreibt, beim Server meistens der String: "Text1Text2" ankommt.
ClientSocket1.Socket.SendText('Text1');
ClientSocket1.Socket.SendText('Text2'); Ich habe das temporär so umgangen, nur funktioniert dies auch nicht immer:
Delphi-Quellcode:
außerdem geht Zeit drauf.
ClientSocket1.Socket.SendText('Text1');
Sleep(50); ClientSocket1.Socket.SendText('Text2'); Weis jemand, wie ich das anders machen könnte? Also so, dass erst "Text1" und im nächsten Ereignissaufruf "Text2" ankommt. Florian |
Re: "Cache" von Sockets löschen
Versuch mal, statt dem Sleep(50) ein SendText(#0) zu verwenden.
|
Re: "Cache" von Sockets löschen
Danke,
ich versuchs mal. |
Re: "Cache" von Sockets löschen
Moin!
Ich kann mich nur wiederholen: Die Sockets sind reine Datenübertragungskomponenten - sie kümmern sich einen sch*** dreck um die abtrennung von den Datenpacketen. Wenn du sowas haben willst, dann bau dir ein Protokoll. Die Sockets garantieren dir niemals, dass getrennt gesendete Packete auch einzelnd, gleich getrennt wieder ankommen. Ganz im Gegenteil. Es kann sehr gut sein, das du die Packete sogar noch kleiner bekommst - jedes Zeichen einzelnd z.B. Also pass deinen Code an und verlass dich nicht auf Dinge die nirgendwo erwähnt/beschrieben/garantiert werden. Bau dir ein simples Protokoll was einfach nur ein Trennzeichen definiert zwischen den Nachrichten - und vor allem sammle genug Daten vor der Ausgabe bzw. beachte das es leicht zu einer Defragmentierung kommen kann/wird. Sorry für den Text, aber diese weitläufig verbreitete Meinung, das die SendText() Stückelung so hinten wieder aus dem Socket rauskommt, geht mir auf die Nerven. Wenn man in x-beliebigen Delphi Foren sucht, findet man immer wieder den Hinweis dazu, aber trotzdem findet wohl kein neuer Nutzer diese Beiträge... :wall: :wall: MfG Muetze1 |
Re: "Cache" von Sockets löschen
Hiho,
Lese dir die RFC 147 mal durch, dort ist beschrieben wie Socket definiert ist. Soweit ich mich erinnern kann wird das end of line durch #13#10 gekennzeichnet und somit der LineMode aktiviert. MfG :) |
Re: "Cache" von Sockets löschen
Moin!
Zitat:
2. Es steht nix von CR/LF drinne - wäre ja noch schöner 3. Der Socket dient der reinen Datenübertragung - wenn du ihm ein CR/LF reingibst, dann kommt das beim Empfänger wieder raus. Wenn du ihm reine Binärdaten reinpackst, kommen diese auch wieder raus. 4. Nein, SendText packt kein CR/LF hinter den Text - wäre ja noch schöner wenn irgendwelche Automatismen die zu sendenen Daten verändern... 5. EOL tritt wenn, dann nur bei zeilenbasierten Sockets auf - dieses wäre dann aber schon wieder eine Art Protokoll - und da kannst du es festlegen wie du willst. Die Allgemeinheit würde bei solchen zeilenbasierten Socket CR/LF nehmen, klar. Aber das bleibt trotzdem dir überlassen, die Socket Komponenten haben keine Automatismen und übertragen stur die Daten. MfG Muetze1 |
Re: "Cache" von Sockets löschen
Moin Moin Muetze1!
Danke für die Aufklärung , und mein Tipp die RFC 147 durchzulesen war ein nettgemeinter Hinweis an den Threadersteller und bezog sich keineswegs auf deinen Kommentar. zu 1.-5) Der Socket selbst ist nur ein Endpunkt des Kommunikationslinks,gekennzeichnet durch IP und Port. Kann dir da also nur zustimmen. Glaube das Thema Sockets hat es dir angetan :) Dann wäre ja Zitat:
MfG :) |
Re: "Cache" von Sockets löschen
Moin!
Zitat:
Zitat:
MfG Muetze1 |
Re: "Cache" von Sockets löschen
Heist das, das wenn ich
Delphi-Quellcode:
aufrufe erst Text1 und dann Text2 ankommt?
SendText('Text1');
SendText(#13#10); SendText('Text2'); PS: Mit SendText(#0) kam nur in 1 von 100 Fällen überhaupt noch Text an. :wink: Florian |
Re: "Cache" von Sockets löschen
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:10 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