Font
[thread]5694[/thread]

Länge bei recv: Wie lange kann die Länge bei recv sein ?



<< >> 8 entries, 1 page
weismat
 2003-09-07 12:20
#84746 #84746
User since
2003-08-18
142 articles
BenutzerIn
[default_avatar]
Ich habe eine Bibliothek geschrieben, um von einem Port Nachrichten zu schreiben und zu lesen.
Beim Auslesen habe ich ein Problem mit der Länge. Alle Nachrichten haben am Anfang eine 10-stellige Zahl, die die Länge angibt. Irgendwie habe ich Schwierigkeiten, wenn ich die Länge direkt beim recv übernehme, wenn die Nachricht sehr lang sind. Als Workaround lese ich zur Zeit byteweise aus, was natürlich negativ auf die Performance wirkt.
Hat jemand eine Idee ?
Code: (dl )
1
2
3
4
5
  $remote->recv($length, 10);
#  $remote->recv($message,$length); funktioniert nicht
 for ($i=0;$i<$length;$i++) {
   $remote->recv($j,1);
   $message=$message . $j;
steffenw
 2003-09-08 00:58
#84747 #84747
User since
2003-08-15
692 articles
BenutzerIn
[Homepage] [default_avatar]
Irgendwie hat die Zahl, die bei recv übergeben wird, etwas mit der Blocklänge zu tun und größere als 4096 habe ich noch nicht in Beispielen gesehen. Es ist auch so, wenn Du 4096 Bytes erwartest und das Paket die Anzahl nicht enthält, daß dann recv mit der kleineren Länge zurückkommt und erst beim nächsten recv die restilchen Bytes gelesen werden können. Also kann der Code nur eine Schleife bis zum Erreichen der Gesamtlänge oder Verbindungsende sein.
Code: (dl )
1
2
3
4
5
6
$remote->recv($length, 10);
while ($length)
{ $remote->recv(my $message_block, $length > 4096 ? 4096 : $length);
  $message .= $message_block;
  $length -= length $message_block;
}

Dein Code klappt eigentlich nur, weil Du in der for-Schleife immer nur ein Byte erwartest und 0 erhaltene Byte einem Verbindungsabbruch entsprechen, nur eine while-Schleife kann die Bytes einsammeln, bis die Länge voll ist.

Nur mal so nebenbei:
Wenn ich for ($i=0;$i<$length;$i++) lese, denke ich immer, daß das kein Perl ist. Perl ist foreach my $i (0..$length-1), oder ?
$SIG{USER} = sub {love 'Perl' or die};
Crian
 2003-09-08 17:27
#84748 #84748
User since
2003-08-04
5840 articles
ModeratorIn
[Homepage]
user image
Am besten for statt foreach, spart vier Zeichen beim Tippen und beim Lesen :-)
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
steffenw
 2003-09-08 22:44
#84749 #84749
User since
2003-08-15
692 articles
BenutzerIn
[Homepage] [default_avatar]
Du hast natürlich Recht, jedoch sollte man ein Perlprogramm immer so schreiben, daß es gutem Englisch entspricht.

So ist for (1..3) gutes Englisch, foreach (1..3) nicht. Bei for $value (@array) und foreach $value (@array) ist es genau umgekehrt.

Man schreibt ja auch nicht error() unless open(...);, sondern open() or error();
$SIG{USER} = sub {love 'Perl' or die};
weismat
 2003-09-10 04:27
#84750 #84750
User since
2003-08-18
142 articles
BenutzerIn
[default_avatar]
Hallo Steffem,
vielen Dank für die Hilfe. Die Performance hat sich spürbar verbessert.
Mein schlechter Perl-Stil kommt durch meine schlechte C und Java Kinderstube, ich habe Perl erst vor kurzem gelernt, weil ich tippfaul bin, schnell Ergebnisse haben und nicht großartig etwas auf einem Server installieren will.
Crian
 2003-09-10 14:55
#84751 #84751
User since
2003-08-04
5840 articles
ModeratorIn
[Homepage]
user image
Da ist mein Sprachempfinden wohl anders, ich benutze generell kein foreach, weil ich es überflüssig finde.
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
steffenw
 2003-09-10 22:31
#84752 #84752
User since
2003-08-15
692 articles
BenutzerIn
[Homepage] [default_avatar]
Wie gesagt, "Crian", es gibt mehr als einen Weg.

"weismat", ich merke immer wieder, wenn ich mich mit Kollegen vergleiche, die nicht Perl programmieren, daß ich mit Perl wie ein Level höher programmieren kann. Manch einer läßt im Sinne einer schnellen Lösung die so wichtige Abprüfung von Usereingaben aus falscher Faulheit einfach weg und erlebt später eine peinliche Situation. Mit Perl ist so etwas einfach. Und weil es so einfach ist, programmiere ich es auch immer mit, was ja eigentlich normal sein sollte. Ich denke, Du bist mit Perl und Deiner gesunden Faulheit auf dem richtigen Weg, jedenfalls, was die Anwendungsprogrammierung betrifft.
$SIG{USER} = sub {love 'Perl' or die};
Crian
 2003-09-11 15:59
#84753 #84753
User since
2003-08-04
5840 articles
ModeratorIn
[Homepage]
user image
Jau, TIMTOWDI
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
<< >> 8 entries, 1 page



View all threads created 2003-09-07 12:20.