"send: Cannot determine peer address" nach Timeout mit UDP Server -Perl Socket eval{}

H

honesta

Mahlzeit,

ich habe ein kleines Problem und würde mich über eure Mithilfe freuen!

Folgender UDP-Server soll nach einem Timeout über eval{} (wenn dieser nach 5 Sekunden nichts empfängt) dem Client "$stuff" mitteilen. Leider bekomme ich nach dem Timeout folgende Fehlermeldung: "Cannot determine peer address at udp_server.pl line 24". Warum wird mein Socket bitteschön geschlossen (?) nach dem Timeout?! Paradoxerweise, wenn ich den Socket neu einbinde nach dem Timeout, bekomme ich folgende Meldung: "ERROR in socket creation: Die Adresse wird bereits verwendet".
Ob ich nun statt "die", "last" verwende, ändert auch nichts.
Interessanterweise tritt der Fehler in der Kommandozeile auf, aber nicht im Debugger.

Vielen Dank im Voraus!

Code:
#!/usr/bin/perl

use strict 'vars';
use warnings;
use IO::Socket::INET;

my $port="50000";
my $socket;
my $get;
my $stuff;

$socket = new IO::Socket::INET (    
LocalPort => $port,
Proto => 'udp',
) or die "ERROR in socket creation: $!\n";

eval {
     local $SIG{ALRM} =sub {die};
     alarm(5);
     $socket -> recv($get, 1024);
     alarm(0);
     };    
     if ($@) {
          $socket->send($stuff);           
     }

Perl v5.14.2
Linux version 3.1.0-1.2-desktop
gcc version 4.6.2 (SUSE Linux)
openSUSE 12.1 (x86_64)

P.S.: Ich hatte diesen Beitrag bereits in einem anderen Forum (erst beste bei google) gepostet, aber das ist eingeschlafen.
 
Gut, hab Perl zwar noch nicht benutzt, aber...
[...]
Folgender UDP-Server soll nach einem Timeout über eval{} (wenn dieser nach 5 Sekunden nichts empfängt) dem Client "$stuff" mitteilen.
[...]
Aufgrund deines geposteten Codes bezweifle ich dass mit $stuff der Client gemeint ist. Ich würde eher sagen, dass es sich um die Daten handelt die du via IP/UDP dem Clienten mitteilen willst.

<edit>
Okay. Kann sein, dass ich das Zitierte in der Tat falsch interpretiert habe und du sowieso das Selbe meinst. Weglöschen bzw. wegeditieren mach ich aber nicht. Da gibt es ja ein Sprichwort: "Was liegt, das pickt!". Außerdem würde sich das Ganze eh nichts bringen. Wird sicher schon irgendwo im Cache liegen. Pech gehabt.
</edit>


[...]
Leider bekomme ich nach dem Timeout folgende Fehlermeldung: "Cannot determine peer address at udp_server.pl line 24". Warum wird mein Socket bitteschön geschlossen (?) nach dem Timeout?!
[...]
Mein Englisch könnte zwar besser sein, aber "Cannot determine peer address" bedeutet sicher nicht (ohne das ich ein Wörterbuch brauche), dass der Socket geschlossen wird/ist. Ansonsten würde etwas ähnliches wie "Socket will be closed/closed" stehen. Oder?

Zwar keine 1zu1-Übersetzung, aber das ist "eher" ein Hinweis dass irgendwas mit der Ziel-Adresse (Client) nicht stimmt. Zumindestens sehe ich in deinem Code keinen Hinweis darauf. (weder im Konstuktor der Klasse IO::Socket::INET und auch im restlichen Code nicht)
[...]
Paradoxerweise, wenn ich den Socket neu einbinde nach dem Timeout, bekomme ich folgende Meldung: "ERROR in socket creation: Die Adresse wird bereits verwendet".
Ob ich nun statt "die", "last" verwende, ändert auch nichts.
[...]
Naja, da wird halt $socket->close fehlen. (oder ähnlich - Hab die Dokumentation für die IO::Socket::INET Klasse nicht komplett gelesen.)

<edit>
Der Socket muss auch wieder nach erledigter Arbeit geschlossen werden. Deswegen hab ich in der letzte Zeilen vom Code socket->close hinzugefügt. Und da ich nicht weiß, wie du das Script aufrufst gilt das nur als Beispiel.
</edit>

[...]
Interessanterweise tritt der Fehler in der Kommandozeile auf, aber nicht im Debugger.
[...]
printf ist nach wie vor einer der besten Debugger.^^

Anbei eine korrigierte Version. Hab ich aber nicht ausprobiert, deswegen ohne Gewähr. Das heißt, könnte funktionieren oder auch nicht. Wollte ja ursprünglich in diesem Absatz auf das Kommentar in meiner Signatur hinweisen, aber...naja.
Code:
#!/usr/bin/perl

use strict 'vars';
use warnings;
use IO::Socket::INET;

my $port="50000";
my $socket;
my $get;
[COLOR="#FF0000"]my $stuff="SomeDataaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";[/COLOR]

$socket = new IO::Socket::INET (    
[COLOR="#FF0000"]LocalAddr => 'localhost',[/COLOR]
[COLOR="#FF0000"]PeerPort  => $port, # Target-Port[/COLOR]
[COLOR="#FF0000"]PeerAddr  => inet_aton("666.666.666.666"), # Target-Address (Invalid Example) [/COLOR]
Proto => 'udp',
) or die "ERROR in socket creation: $!\n";

eval {
     local $SIG{ALRM} =sub {die};
     alarm(5);
     $socket -> recv($get, 1024);
     alarm(0);
     };    
     if ($@) {
          $socket->send($stuff);           
     }

[COLOR="#FF0000"]$socket->close;[/COLOR]

(Ich entchuldige mich dafür, dass ich meine Antwort "leicht" sarkastisch verfasst habe. War aber schwer, nicht so zu schreiben. Gut, wär vielleicht klüger gewesen nicht darauf zu antworten. Zum Thema Google schreib ich besser gar nichts...)
 
Zuletzt bearbeitet:

Ähnliche Themen

Server und Client für TCP und UDP

Rollei Mini Wifi Camcorder

Ubuntu X / dbus problem

Syslog verfeinern ?

Samba Update von 3.2.5 auf 3.5.6 - Probleme beim Server Browsen

Zurück
Oben