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
Narses: Überflüssige Zeilenumbrüche/Leerzeilen entfernt.
Narses - Fr 08.05.09 19:16
Moin!
Mortal-Shadow hat folgendes geschrieben : |
| 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:
Mortal-Shadow hat folgendes geschrieben : |
| 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?
Mortal-Shadow hat folgendes geschrieben : |
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'); |
Mortal-Shadow hat folgendes geschrieben : |
| 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; 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!
Mortal-Shadow hat folgendes geschrieben : |
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'); end;
procedure TForm1.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket); var a : string; begin a := socket.ReceiveText; 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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!