Autor Beitrag
simlei
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 23

WIN XP
D7
BeitragVerfasst: So 23.03.08 14:04 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 25.03.08 03:06 
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, zu tun hat. ;)

Das wird erst dann "komisch", wenn du solche, prinzipiell kränkelnde, Konstrukte baust: :idea:
ausblenden 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, vielleicht ist das ja was für dich. ;)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.