Entwickler-Ecke
Internet / Netzwerk - Narses' Binärprotokolltutorial @Delphi >=2009
FinnO - Sa 09.01.10 19:19
Titel: Narses' Binärprotokolltutorial @Delphi >=2009
Hey Leute,
In Delphi 2010 wird ja bekanntermaßen Unicode verwendet, weshalb die Strings andere Längen haben. Jetzt überlege ich gerade, ob ich das Ganze Protokoll schlicht "uminterpretiere" und viel Spaß mit der Längenänderung habe (btw, wie viel Byte hat denn jetzt ein Zeichen?) oder ob ich einen neuen Typ definiere, der hauptsächlich ein Array of Byte beinhaltet und dass dann irgendwie versende.
Tipps, Anregungen, Vorschläge erwünscht ;)
BenBE - Sa 09.01.10 19:23
Schlag
Narses solange, bis er es freiwillig in seinem Tutorial korrigiert.
Alternativ: AnsiString statt String verwenden.
Ich bin für ersteres
FinnO - Sa 09.01.10 19:26
Wird gemacht, Sir^^
*Baseballschläger such*
---
Moderiert: von
FinnO: Nachtrag: ---
funktioniert leider nicht, wie gewünscht. Wenn ich mit
Socket.SendText(meinAnsiString); sende werden die ersten 4 Bytes geflissentlich ignoriert :(
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| SetLength(BinMessage,4); PInteger(@BinMessage[1])^ := Length(edInput.Text); BinMessage := BinMessage + edInput.Text; ClientSocket.Socket.SendText(edInput.Text); |
hier, beim empfangen:
Delphi-Quelltext
1: 2: 3:
| BinMessage := Socket.ReceiveText; memLog.Lines.Add(BinMessage) ; memLog.Lines.Add(Dump(BinMessage)); |
mysteriös :(
Narses - Sa 09.01.10 19:57
Moin!
FinnO hat folgendes geschrieben : |
| Wird gemacht, Sir^^ |
Na dann bin ich ja mal gespannt, wie du das
Narses beibringen möchtest... 8) :twisted:
FinnO hat folgendes geschrieben : |
| funktioniert leider nicht, wie gewünscht. Wenn ich mit Socket.SendText(meinAnsiString); sende werden die ersten 4 Bytes geflissentlich ignoriert :( |
Du solltest vielleicht auch mal den richtigen String senden: :zwinker:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| SetLength(BinMessage,4); PInteger(@BinMessage[1])^ := Length(edInput.Text); BinMessage := BinMessage + edInput.Text; ClientSocket.Socket.SendText(BinMessage); |
FinnO hat folgendes geschrieben : |
| hier, beim empfangen: |
Beim Empfang gibt es Probleme mit der Methode .ReceiveText, da muss man mit einem Workaround ran:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| var BinMessage: AnsiString; Len: Integer; begin Len := Socket.ReceiveLength; SetLength(BinMessage,Len); if (Len > 0) then begin Len := Socket.ReceiveBuf(PAnsiChar(BinMessage)^,Len); SetLength(BinMessage,Len); end; memLog.Lines.Add(Dump(BinMessage)); |
cu
Narses
FinnO - Sa 09.01.10 20:06
*tilt*
und ich dachte, sowas doofes passiert allen, nur mir nicht :D
Astat - Sa 09.01.10 20:26
FinnO hat folgendes geschrieben : |
Hey Leute,
oder ob ich einen neuen Typ definiere, der hauptsächlich ein Array of Byte beinhaltet und dass dann irgendwie versende.
Tipps, Anregungen, Vorschläge erwünscht ;) |
Hallo Narses, habe meine Socketklassen alle mit Pointer und cbLen aufgebaut, alternativ auch mit array of byte.
Strings, Pchar verwende ich schon lange nicht mehr.
lg. Astat
FinnO - Sa 09.01.10 20:35
naja, aber der unterschied zwischen einem String und einem Array of Byte hält sich wirklich mal in Grenzen ;)
Narses - Sa 09.01.10 20:38
Moin!
Wie im Tut zu lesen, habe ich damals deshalb Strings genommen, weil hier die Speicherverwaltung komplett von der CompilerMagic übernommen wird. Dass Embar-Bor-Inpri-Code-cadero mal aus Strings UnicodeStrings machen würde (und zwar generische!), war da nicht abzusehen. ;)
cu
Narses
Martok - Sa 09.01.10 20:41
FinnO hat folgendes geschrieben : |
| naja, aber der unterschied zwischen einem String und einem Array of Byte hält sich wirklich mal in Grenzen ;) |
Bis auf eins: mit Strings hat man gaanz viel Compilermagic und muss sich nicht mit fehlerträchtigen Move-Konstrukten rumschlagen.
Könnte ja auch mal einer in den NBFP-Komponenten auf `Binary` und `BinaryChar` umbauen, die per IFDEF dann auf den jeweils passenden Typen umgebogen werden. Macht IIRC die J(V)CL so.
Da aber in D2010 selbst einige Funktionen defekt sind, und trotz Ansi im Namen auf Unicode arbeiten, wird das etwas schwierig.
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!