Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi "Cache" von Sockets löschen (https://www.delphipraxis.net/45747-cache-von-sockets-loeschen.html)

Zacherl 11. Mai 2005 18:22


"Cache" von Sockets löschen
 
Hallo,
ich habe folgendes Problem:

Die Socket Komponenten haben die (nervende) Eigenschaft, dass sie, wenn man

Delphi-Quellcode:
ClientSocket1.Socket.SendText('Text1');
ClientSocket1.Socket.SendText('Text2');
schreibt, beim Server meistens der String: "Text1Text2" ankommt.

Ich habe das temporär so umgangen, nur funktioniert dies auch nicht immer:

Delphi-Quellcode:
ClientSocket1.Socket.SendText('Text1');
Sleep(50);
ClientSocket1.Socket.SendText('Text2');
außerdem geht Zeit drauf.

Weis jemand, wie ich das anders machen könnte?
Also so, dass erst "Text1" und im nächsten Ereignissaufruf "Text2" ankommt.

Florian

Ultimator 11. Mai 2005 18:23

Re: "Cache" von Sockets löschen
 
Versuch mal, statt dem Sleep(50) ein SendText(#0) zu verwenden.

Zacherl 11. Mai 2005 18:27

Re: "Cache" von Sockets löschen
 
Danke,
ich versuchs mal.

Muetze1 11. Mai 2005 22:20

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

Johnny_W 11. Mai 2005 23:21

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 :)

Muetze1 12. Mai 2005 01:27

Re: "Cache" von Sockets löschen
 
Moin!

Zitat:

Zitat von Johnny_W
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 :)

1. Ok, habe ich.
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

Johnny_W 12. Mai 2005 09:07

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:

Also so, dass erst "Text1" und im nächsten Ereignissaufruf "Text2" ankommt.
#13#10 bei SendText eine Lösung der Problematik?

MfG :)

Muetze1 12. Mai 2005 09:32

Re: "Cache" von Sockets löschen
 
Moin!

Zitat:

Zitat von Johnny_W
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.

Oh, sorry - hatte ich falsch verstanden... :roll:

Zitat:

Zitat von Johnny_W
Dann wäre ja
Zitat:

Also so, dass erst "Text1" und im nächsten Ereignissaufruf "Text2" ankommt.
#13#10 bei SendText eine Lösung der Problematik?

Ja, das wäre ja dann ein eindeutiger Trenner und bildet somit schon eine Art Protokoll...

MfG
Muetze1

Zacherl 12. Mai 2005 13:16

Re: "Cache" von Sockets löschen
 
Heist das, das wenn ich
Delphi-Quellcode:
SendText('Text1');
SendText(#13#10);
SendText('Text2');
aufrufe erst Text1 und dann Text2 ankommt?

PS: Mit SendText(#0) kam nur in 1 von 100 Fällen überhaupt noch Text an. :wink:

Florian

Vjay 12. Mai 2005 13:34

Re: "Cache" von Sockets löschen
 
Zitat:

Zitat von Florian Bernd
Heist das, das wenn ich
Delphi-Quellcode:
SendText('Text1');
SendText(#13#10);
SendText('Text2');
aufrufe erst Text1 und dann Text2 ankommt?

PS: Mit SendText(#0) kam nur in 1 von 100 Fällen überhaupt noch Text an. :wink:

Florian

Ja, kann aber durchaus an div. stellen getrennt sein. Schick doch nach jedem Text #13#10 und warte im Eventhandler solange bis #13#10 kommt und werte dann den text aus. Verwenden tuste dafür einen MemoryStream o.ä. als Cache.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:48 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz