Thread [IO::Socket] Größe einer Nachricht (13 answers)
Opened by pktm at 2011-05-09 16:11

rosti
 2011-05-11 07:42
#148444 #148444
User since
2011-03-19
3199 Artikel
BenutzerIn
[Homepage]
user image
Das ist richtig ;)

Vielleicht noch ein paar Worte zu Sockets. Ein S. ist ein Handle auf dem OSI-Layer 4 (TCP). In einem S. können Rohdaten übertragen werden, das sind Byte-Sequenzen. Betrachten wir das Net-Time-Protocol, da wird das gemacht:

Ein Zeitserver hat auf Port 37 ein S. offen. Ein Client macht das S. (handle) auf und liest genau 4 Byte, 32 Bit. Es sind immer 4 Byte, auch wenn die Zahl, die Anzahl der Sekunden seit 1.1.1900 ständig wächst.

Auf diese Art und Weise können natürlich auch ganz andere Byte-Sequenzen in Sockets übertragen werden. Sequenzen können unterteilt sein in "Sätze" bzw. Records. In Sachen HBCI ist von Segementen die Rede, dieser Begriff ist ein bischen irreführend.

Freilich kann auch Text in ein Socket, das sind auch nur Bytes, nur diese Bytes sind eben auch lesbar.

In Perl gibt es ein Modul, was komplexte Datenstrukturen in binary Sequenzen serialisiert: Storable.pm

Gewöhnlich wird Storable.pm genutzt, um Daten in Dateien zu schreiben oder aus Dateien zu lesen. Storable.pm hat Methoden, die mit einem Handle umgehen können, und so kann mit Storable auch eine komplexe Datenstruktur in ein Socket geschrieben werden und am anderen Ende aus dem Socket auch wieder gelesen und unzerknittert wiederhergestellt werden. In diesem Fall ist aus dem Socket die gesamte Seuenz zu lesen.

Andere Serialize-Algorithmen arbeiten mit Längenangaben oder mit Records, die eine konstante Länge haben. Der Phantasie zum Serialisieren sind nur Grenzen gesetzt hinsichtlich der Performance. In einem Socket braucht es keine Komma's zum Trennen der Records, die Strukturierung erfolg auf Byte-Ebene.

Die Designer von HBCI haben das gründlich missverstanden und so erfordert die maschinelle Verarbeitung der "Segmente" einen unnötigen und unangemessenen Aufwand, es fehlen u.a. die Längenangaben. Wo es doch so einfach ist, eine Längenangabe in eine feste Anzahl an Bits zu packen.

Viele Grüße,
Rolf

Zum Spielen, Socket-Server und Client untenstehend:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#!/usr/bin/perl

###########################################################################
# Server, der an einem bestimmten Port lauscht
###########################################################################
use strict;
use IO::Socket qw(SOMAXCONN);

my $port = 8787;

my $server_sock = IO::Socket::INET->new(
        LocalPort => $port,
        Listen => SOMAXCONN,
        Proto => 'TCP',
        Reuse => 1,
) or die "Kann Socket nicht aufbauen";

print "Warte auf Daten an Port $port\n\n";

while(my $peer = $server_sock->accept){
        my $data = <$peer>;
        print $data;
        print $peer qq(<policy-file-request/>);

        $peer->close;
}



#!/usr/bin/perl

###########################################################################
# Einfacher Client, der in ein Socket schreibt
###########################################################################
use strict;
use IO::Socket;

my $socket = new IO::Socket::INET (
        PeerAddr => 'rolfrost',
        PeerPort => 8787,
        Proto    => 'tcp'
) or die "Kein Socket bekommen!";

print $socket "123456789\n";
$socket->close;












View full thread [IO::Socket] Größe einer Nachricht