Entwickler-Ecke

Internet / Netzwerk - TClientSocket - Warten, bis alle nachrichten angekommen sind


simlei - So 23.03.08 14:04
Titel: TClientSocket - Warten, bis alle nachrichten angekommen sind
Hallo! Ich habe ein _dringendes_ Problem: Ich arbeite an einem verschlüsselten Chat, und hatte bisher noch keine Schwierigkeiten mit dem TClientSocket und dem Datenempfang - bis jetzt, weil ich nun längere Sequenzen über die Leitung sende (ganze Listen von Signaturen). Ich habe nun das Problem, dass das Read-Ereignis aufgerufen wird, wenn erst die halbe Nachricht angekommen ist; diese wird dann geparst (sollte auch funktionieren, wenn nur die Hälfte da ist, weil es am Ende der Sequenz ein Ende-zeochen gibt). Das wirkliche problem ist jetzt aber, dass, während die erste Hälfte geparst wird, die zweite Hälfte schon reinkommt und geparst wird - aber schon eher fertig ist. Der Buffer wird nicht in der richtigen Reihenfolge beschrieben, und am Ende kommt nur Chaos raus, denn das Ende-Zeichen kommt eben irgendwann in der Mitte in den Buffer und dort wird abgebrohen.

Kann mir jemand sagen, wie ich es bewerkstelligen kann, dass das read-Ereignis hintereinander ausgeführt wird? DANKE!!
(OK wäre auch eine Lösung, bei der TClientSocket wartet, bis alles angekommen ist.. dann erst die Read-Prozedur aufruft, stelle ich mir aber schwierig vor..)


Narses - Di 25.03.08 03:06
Titel: Re: TClientSocket - Warten, bis alle nachrichten angekommen sind
Moin!

user profile iconsimlei hat folgendes geschrieben:
Kann mir jemand sagen, wie ich es bewerkstelligen kann, dass das read-Ereignis hintereinander ausgeführt wird?
Die OnRead-Ereignisse treffen "hintereinander" ein, wobei das allerdings nix mit der Datenmenge, die eingetroffen ist [http://www.delphi-library.de/topic_Datenpakete+bei+den+SocketKomponenten+auseinanderhalten_56194.html], zu tun hat. ;)

Das wird erst dann "komisch", wenn du solche, prinzipiell kränkelnde, Konstrukte baust: :idea:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
begin
  //...
  Application.ProcessMessages;
  //...
end;
Hier wird innerhalb eines Ereignishandlers nochmal die Nachrichtenwarteschlange abgearbeitet - was zu "unvorhergesehenen" Effekten führen kann, wenn man nicht ganz genau weiß, was man da tut. :?

Schau mal hier [http://www.delphi-forum.de/topic_TNBFPA+SocketKompos+mit+Protokollfunktionen_71223.html], vielleicht ist das ja was für dich. ;)

cu
Narses