Entwickler-Ecke

Internet / Netzwerk - Kein #13 mitsenden


Mortal-Shadow - Fr 08.05.09 19:10
Titel: Kein #13 mitsenden
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:

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

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:

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 [http://www.delphi-library.de/topic_Datenpakete+bei+den+SocketKomponenten+auseinanderhalten_56194.html]? ;)

cu
Narses


Mortal-Shadow - 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:

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

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:

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


Mortal-Shadow - 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 - 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 [http://www.delphi-library.de/topic_Warum+gibt+es+kein+ReceiveStream+bei+den+Sockets_65367.html], ja? ;)

cu
Narses