Server/Client UDP

Alles, was Perl betrifft, kann hier besprochen werden.

Server/Client UDP

Postby pati » 15. September 2007 18:13

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:
Code: Select all
$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! :?
User avatar
pati
 
Posts: 1
Joined: 15. September 2007 18:00
Location: München

Return to Perl

Who is online

Users browsing this forum: No registered users and 41 guests