Peter: Server/Client UDP

Hallo!

So wie ich in diesem Forum der Perl-Community neu bin, so neu ist auch für mich nach wie vor der Umgang mit dieser Programmiersprache.
Ich arbeite derzeit an einem Server-Client Programm, dass auf der Basis von UDP IP-Pakete übers Netz verschicken soll. Bekanntlich ist UDP eine unsichere Verbindung, die auch bewusst gewählt worden ist. Der Server soll die vom Client verschickten Pakete zählen und in einem Log-File festhalten.

Mein Problem ist nun dieses: Weil UDP bekanntlich unsicher ist und Pakete entweder verloren gehen oder verspätet ankommen, habe ich bewusst einen Timeout eingebaut, der aber irgendwie nicht so recht greift. In meinem kleinen Versuchs-Netz habe ich vom Client 8 Pakete verschickt und die ersten drei sind beim Server angekommen, aber danach bleibt er hängen, d. h. die Zeile

if ($@ and $@!~ /timeout/) {
$log->logVerbose("-----!!! TIMEOUT !!!-----");  }

kommt nicht zur Geltung.
Es ist eindeutig ein Deadlock vorhanden, aber wie kann ich ihn beheben? Was habe ich Übersehen? Wie sieht die Lösung aus? Vielleicht kann jemand von Euch mir einen Tipp bzw. Lösungsvorschlag bieten.

Zur Übersicht poste ich den entscheidenden Ausschnitt:

$ipcount = 0;
while($data = $server->recv()) {
($total, $actual, $realdata) = split('_t_', $data);
$time_out = ((($total-$actual)*$waitTime)+$delayNet);
if($data eq 'Thank You'){
last;
}else{
eval{
local $SIG{ALRM} = sub { die "timeout" };
alarm($time_out);
eval{
$digest = md5_base64($realdata);
$log->logVerbose("RECV ".length($data)." bytes (MD5 $digest) from ".$server->getSenderhost().":".$server->getSenderport()." | (".($actual+1)." of $total)");
$ipcount++;
};
alarm(0.0);
};
}
if($@ and $@ !~ /timeout/) {
$log->logVerbose("-----!!! TIMEOUT !!!-----");
#$last;
}

Danke mal für den, der mir hilft, vor lauter Bäume den Wald wieder zu sehen! ;-)

  1. Hallo Peter,

    So wie ich in diesem Forum der Perl-Community neu bin, so neu ist auch für mich nach wie vor der Umgang mit dieser Programmiersprache.

    ich würde dieses Forum nicht unbedingt als "Forum der Perl-Community" bezeichnen, auch wenn hier Perl-Fragen diskutiert und beantwortet werden.

    Zur Übersicht poste ich den entscheidenden Ausschnitt:

    Code zu posten ist zwar fast immer eine gute Idee, aber wenn Du Hilfe haben
    willst, dann solltest Du es Deinen Helfern auch leicht machen Dir zu helfen.

    Du scheinst Dich jedoch an folgende Maxime zu halten:

    Real programmers don't comment their code.
        If it was hard to write, it should be hard to read.

    In Deinem eigenen Interesse solltest Du es Dir angewöhnen, auch den eigenen
    Code, den außer Dir keiner zu sehen bekommt, zu kommentieren. Du wirst es
    Dir selbst danken, wenn Du Dir Deinen Code ein paar Wochen später wieder
    anschaust, um eine kleine Änderung einzubauen.

    [code lang=perl]

    $ipcount = 0;
    while($data = $server->recv()) {

    [... viele Zeilen ohne einen einzigen Kommentar gelöscht ...]

    if($@ and $@ !~ /timeout/) {
    $log->logVerbose("-----!!! TIMEOUT !!!-----");
    #$last;
    }

    [/perl]

    Erwartest Du im Ernst, dass sich jemand die Mühe macht zu verstehen, was
    Dein Code bezweckt - und was Du möglicherweise von Deinem Code erwartest.

    Zudem verwendest Du etliche Variablen, deren Inhalt Dir möglicherweise
    bekannt ist, aber nicht Deinen potentiellen Helfern, aber da gilt wohl:

    Real Software Engineers don't comment their code.
        The identifiers are so mnemonic they don't have to.

    Bitte bessere nach, dann hast Du auch bessere Chancen auf zielführende Hilfe,
    siehe auch Tipps für Fragende.

    Freundliche Grüße

    Vinzenz

    1. Moin!

      So wie ich in diesem Forum der Perl-Community neu bin, so neu ist auch für mich nach wie vor der Umgang mit dieser Programmiersprache.

      ich würde dieses Forum nicht unbedingt als "Forum der Perl-Community" bezeichnen, auch wenn hier Perl-Fragen diskutiert und beantwortet werden.

      Zur Übersicht poste ich den entscheidenden Ausschnitt:

      Code zu posten ist zwar fast immer eine gute Idee, aber wenn Du Hilfe haben
      willst, dann solltest Du es Deinen Helfern auch leicht machen Dir zu helfen.

      Cross zu posten scheint mir allerdings keine gute Idee - oder wie erklären sich die unorthodoxen UTF-8-Fragmente im Text sowie die unpassende Anrede?

      - Sven Rautenberg

      --
      "Love your nation - respect the others."