Autor Beitrag
Mortal-Shadow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 110



BeitragVerfasst: Fr 08.05.09 19:10 
Hallo,

ich bin gerade dabei, ein wenig mit den TCPSockets herumzuexperimetieren.
Dabei habe ich bei Narses Protokoll-Tutorial gelesen, dass wenn von einer Nachricht vorerst nur Teil 1 gesendet wird, ihm automatisch ein #13 Zeichen hinzugefügt wird. D.h. in meinem ReceiveBuffer-String, ist dann ein Zeichen zuviel.
Nun war meine Überlegung, wie ich dies umgehen könnte. Ich habe versucht das socket.sendstream() zu benutzen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TForm1.Button1Click(Sender: TObject);
var mystream : TMemoryStream;
begin
mystream := TMemoryStream.create;
mystream.Write('hi', Sizeof('hi'));
clientsocket1.Socket.SendStream(MyStream);
end;


Allerdings wird hierbei kein OnRead-Event ausgelöst. Wie löse ich das am besten?

Moderiert von user profile iconNarses: Überflüssige Zeilenumbrüche/Leerzeilen entfernt.
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Fr 08.05.09 19:16 
Moin!

user profile iconMortal-Shadow hat folgendes geschrieben Zum zitierten Posting springen:
Dabei habe ich bei Narses Protokoll-Tutorial gelesen, dass wenn von einer Nachricht vorerst nur Teil 1 gesendet wird, ihm automatisch ein #13 Zeichen hinzugefügt wird. D.h. in meinem ReceiveBuffer-String, ist dann ein Zeichen zuviel.
Was? :shock: Wo (genau) hast du das gelesen? :gruebel: Scheint mir aus dem Zusammenhang gerissen zu sein. :nixweiss:

user profile iconMortal-Shadow hat folgendes geschrieben Zum zitierten Posting springen:
Nun war meine Überlegung, wie ich dies umgehen könnte.
Gehen wir mal anders rum dran: wozu soll das gut sein oder was willst du eigentlich damit bewirken?

user profile iconMortal-Shadow hat folgendes geschrieben Zum zitierten Posting springen:
Ich habe versucht das socket.sendstream() zu benutzen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TForm1.Button1Click(Sender: TObject);
var mystream : TMemoryStream;
begin
mystream := TMemoryStream.create;
mystream.Write('hi', Sizeof('hi'));
clientsocket1.Socket.SendStream(MyStream);
end;
Der Code ist 100% identisch zu:
ausblenden Delphi-Quelltext
1:
ClientSocket1.Socket.SendText('hi');					


user profile iconMortal-Shadow hat folgendes geschrieben Zum zitierten Posting springen:
Allerdings wird hierbei kein OnRead-Event ausgelöst. Wie löse ich das am besten?
Nur zur Sicherheit: Das hier hast du schonmal gelesen? ;)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Mortal-Shadow Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 110



BeitragVerfasst: Fr 08.05.09 19:41 
Zitat:
Scheint mir aus dem Zusammenhang gerissen zu sein.

Shit, ich habe Punkt 6.2 aus TermCharTutorial-1 falsch im Kopf gehabt.
Das Problem das dort angesprochen worden war, war dass TStrings.text das #13 Zeichen gegen Ende einfügt.
Ich hatte das irgendwie mit dem recevietext verwechselt. Sry.

Aber ganz identisch sind die beiden Codes nicht:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
procedure TForm1.Button1Click(Sender: TObject);
var mystream : TMemoryStream;
begin
mystream := TMemoryStream.create;
mystream.Write('hi', Sizeof('hi'));
clientsocket1.Socket.SendStream(MyStream);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
clientsocket1.Socket.SendText('hi');
end;

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
  var a : string;
begin
showmessage('read');
a := socket.ReceiveText; // Damit das Event mehrfach ausgelöst werden kann
end;


Die Message kommt immer nur bei Button2.
(Das jedoch mehr interessenhalber, da es mein eigentliches Problem ja gar nicht gibt :oops: )
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Fr 08.05.09 19:51 
Moin!

user profile iconMortal-Shadow hat folgendes geschrieben Zum zitierten Posting springen:
Aber ganz identisch sind die beiden Codes nicht:
[...]
Die Message kommt immer nur bei Button2.
Ja, das ist richtig, weil du den Stream nicht "zurückgespult" hast: ;)
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TForm1.Button1Click(Sender: TObject);
  var
    mystream: TMemoryStream;
begin
  mystream := TMemoryStream.create;
  mystream.Write('hi', Sizeof('hi'));
  mystream.Position := 0;
  clientsocket1.Socket.SendStream(MyStream);
end;


Aber nochmal hierzu (und damit indirekt zu dem FAQ-Beitrag mit den Datenpaketen): :idea:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure TForm1.Button2Click(Sender: TObject);
begin
  clientsocket1.Socket.SendText('hi');
  clientsocket1.Socket.SendText('hi'); // sende den Text direkt nochmal hinten dran
end;

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
  var a : string;
begin
  a := socket.ReceiveText; // Damit das Event mehrfach ausgelöst werden kann
  showmessage('read'#13+a);
end;
Vorsicht Falle: wenn du jetzt zwei Events erwartest, dann wirst du enttäuscht sein, es wird "hihi" ausgegeben. Grund steht im FAQ-Beitrag. :)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Mortal-Shadow Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 110



BeitragVerfasst: Fr 08.05.09 20:02 
Ah, ok - mit Position geht auch der Stream.
Aber die Falle kannte ich bereits aus deinem Tutorial. :P
(Aber bei meinem simplen test taucht es nicht auf - und so geht es halt schnell ein beispiel zu machen wegen dem Stream)
Mfg.
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Fr 08.05.09 20:17 
Moin!

user profile iconMortal-Shadow hat folgendes geschrieben Zum zitierten Posting springen:
Ah, ok - mit Position geht auch der Stream.
Das hier kennst du aber auch, ja? ;)

cu
Narses

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