IO::Socket --> Filehandle --> ohne eol/eof

Hallo zusammen,

ich lese per IO::Socket::INET Pakete vom Kabel.
Das funktioniert ja ganz normal als Filehandle:

$server = IO::Socket::INET->new( Proto => ‚tcp‘, …
LocalPort => $PORT,
Listen => SOMAXCONN,
Type => SOCK_STREAM,
Reuse => 1);

while ($client = $server->accept()) {
$client->autoflush(1);
while () {
$req .= $_;

}

}

Nun steht in $req mein Paket … dachte ich.

Der Mechanisemus mit der While Schlife übergibt die Daten erst mit einem EOL oder einem EOF an die $req.

Nun habe ich das Problem, dass meine Pakete kein x10 (EOL) enthalten, und dass es ja auch kein eof Marker gibt, da es ein Socket Filehandle ist.

Wie kann ich am besten Paket für Paket vom Kabel lesen? Ein TCP Paket hat ja kein definiertes Ende… so weit ich weiß…

Vielen Dank.
Stefan

Hallo

Wie kann ich am besten Paket für Paket vom Kabel lesen? Ein
TCP Paket hat ja kein definiertes Ende… so weit ich weiß…

Versuch mal:

Net::RawIP => http://search.cpan.org/dist/Net-RawIP/lib/Net/RawIP.pm

oder vielleicht SOCK_RAW in IO::Socket

==> socket my $socket, PF_INET, SOCK_RAW, 0

aber damit kenne ich mich nicht besonders
gut aus. Ich müßte auch erst rumprobieren.

Grüße

CMБ

Danke für den Hinweis. Ich habe mir das mal angesehen.
Wenn ich das aber nutze, muss ich mir die ganzen TCP Session Funktionen von IO::Socket::inet selbst bauen…

Ich grabe mich derzeit in die Socket Kommunikation ein, denn ich glaube, dass es einen Modus geben müsste, bei dem mir der Socket sagt, wo die Grenze eines Paketes ist.

Dann muss ich mir zwar immer noch das Paket parsen und die Länge aus dem Header verwerten um ggf. zu erkennen, dass da mehr als eine nachricht in dem TCP Paket enthalten ist (das ist bei TCP ja erlaubt), aber ich hätte zumindest eine Sysnchronisationshilfe…

Ich habe mir nun erstmal folgendes gebaut:

mit
„local $/= \1;“
lese ich Byteweise den Hader, bis ich das Längenfeld gesehen habe (bei mir byte 2-4) und switche dann auf
„local $/= ($req_head_len - 4);“
um den gesamten Rest in einem Zug zu lesen.

Damit lese ich aber nur die erste Nachricht in dem TCP Paket …und es ist Kostspielig (CPU).

Um nun alle Nachrichten im TCP Paket zu lesen müsste ich m.E. erstmal an die Länge des IP Paketes kommen, dann an die Länge des TCP headers, um die Länge der TCP Payload zu erfahren (= IP_Lenght - TCP_header_length) um dann anhand der Länge des Payload Headers zu erkennen, dass da noch ein zweites oder drittes Payload- Segment im gleichen TCP Paket ist…

Hat da noch jemand eine Idee?

Gruß Stefan