Versionen dieses Beitrags

C Pointerei

pl
  • C Pointerei
  • moin,
  • >
  • > > Hast Du eine Altenative zu strtok() ?
  • >
  • > Hm. Ich muss erstmal verstehen was Du tust. Sieht so aus, als würdest Du einen String, der Punkte enthält, an den Punkten teilen. Und dann vor jedes Fragment die Länge setzen. Also
  • >
  • > "Hallo.Welt.Der.Zahlen" wird zu "\x05Hallo\x04Welt\x03Der\x06Zahlen".
  • >
  • > Richtig?
  • Korrekt. Nun, es gibt verschiedene Ansätze, in Perl sähe das übrigens so aus:
  • ~~~perl
  • # split into labels
  • # Serialize Nameserver Request
  • sub packreq{
  • my $qname = shift; # example.org
  • my $type = shift || 1; # A
  • my $class = shift || 1; # IN
  • return pack("(C/a*)*", (split /\./, $qname), "").pack("nn", $type, $class);
  • }
  • ~~~
  • Und die Länge der Binary läßt sich am Ergebnis feststellen. Auch wenn mittendrin Nullbytes sind.
  • > > PS: Was mich nervt ist, daß C den Little Endian bevorzugt.
  • >
  • > Tut es nicht. Dein Intel-Prozessor tut das. Nimm einen IBM Großrechner oder einen Motorola 68xxx Prozessor, die sind Big Endian.
  • Stimmt natürlich. Aber am Perlcode siehst Du, wie einfach sich Perl damit tut, `n` ist der Short in Networkorder.
  • Stimmt natürlich. Aber am Perlcode siehst Du, wie einfach sich Perl damit tut, `n` ist der Short in Networkorder. Damit und mit den anderen Schablonen wirst Du von der Architektur unabhängig: Perlcode läuft plattformübergreifend.
  • MfG
  • PS: Zu Deinem Code: Die Länge muss als Byte in ein Socket geschrieben werden.

C Pointerei

pl
  • C Pointerei
  • moin,
  • >
  • > > Hast Du eine Altenative zu strtok() ?
  • >
  • > Hm. Ich muss erstmal verstehen was Du tust. Sieht so aus, als würdest Du einen String, der Punkte enthält, an den Punkten teilen. Und dann vor jedes Fragment die Länge setzen. Also
  • >
  • > "Hallo.Welt.Der.Zahlen" wird zu "\x05Hallo\x04Welt\x03Der\x06Zahlen".
  • >
  • > Richtig?
  • Korrekt. Nun, es gibt verschiedene Ansätze, in Perl sähe das übrigens so aus:
  • ~~~perl
  • # split into labels
  • # Serialize Nameserver Request
  • sub packreq{
  • my $qname = shift; # example.org
  • my $type = shift || 1; # A
  • my $class = shift || 1; # IN
  • return pack("(C/a*)*", (split /\./, $qname), "").pack("nn", $type, $class);
  • }
  • ~~~
  • Und die Länge der Binary läßt sich am Ergebnis feststellen. Auch wenn mittendrin Nullbytes sind.
  • > > PS: Was mich nervt ist, daß C den Little Endian bevorzugt.
  • >
  • > Tut es nicht. Dein Intel-Prozessor tut das. Nimm einen IBM Großrechner oder einen Motorola 68xxx Prozessor, die sind Big Endian.
  • Stimmt natürlich. Aber am Perlcode siehst Du, wie einfach sich Perl damit tut, `n` ist der Short in Networkorder.
  • MfG
  • PS: Zu Deinem Code: Die Länge muss als Byte in ein Socket geschrieben werden.