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 user profile iconNarses 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 user profile iconFinnO: 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);                         //Länge auf 4Bytes <=> Integer
  PInteger(@BinMessage[1])^ := Length(edInput.Text);//Länge (int32) von erster Stelle an reinschreiben

  BinMessage := BinMessage + edInput.Text; //jetzt den Text hinten anhängen {hier ist Text z.B. #4#0#0#0'Test'

  ClientSocket.Socket.SendText(edInput.Text);

hier, beim empfangen:

Delphi-Quelltext
1:
2:
3:
  BinMessage := Socket.ReceiveText;
  memLog.Lines.Add(BinMessage) ; {kommt "Test" heraus}
  memLog.Lines.Add(Dump(BinMessage));{kommt 54 65 73 74 heraus}


mysteriös :(


Narses - Sa 09.01.10 19:57

Moin!

user profile iconFinnO hat folgendes geschrieben Zum zitierten Posting springen:
Wird gemacht, Sir^^
Na dann bin ich ja mal gespannt, wie du das user profile iconNarses beibringen möchtest... 8) :twisted:

user profile iconFinnO hat folgendes geschrieben Zum zitierten Posting springen:
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);                         //Länge auf 4Bytes <=> Integer
  PInteger(@BinMessage[1])^ := Length(edInput.Text);//Länge (int32) von erster Stelle an reinschreiben

  BinMessage := BinMessage + edInput.Text; // kann sein, dass um edInput.Text noch ein AnsiString() muss? Habe kein D2k9...

  ClientSocket.Socket.SendText(BinMessage);

user profile iconFinnO hat folgendes geschrieben Zum zitierten Posting springen:
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 > 0then 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

user profile iconFinnO hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile iconFinnO hat folgendes geschrieben Zum zitierten Posting springen:
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.