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

Dieses Thema im Forum "Ruby, php, Perl, Python ..." wurde erstellt von honesta, 10.12.2012.

  1. #1 honesta, 10.12.2012
    honesta

    honesta Grünschnabel

    Dabei seit:
    10.12.2012
    Beiträge:
    1
    Zustimmungen:
    0
    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.
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 Krotti, 12.12.2012
    Zuletzt bearbeitet: 30.12.2012
    Krotti

    Krotti Foren As

    Dabei seit:
    01.03.2007
    Beiträge:
    78
    Zustimmungen:
    0
    Gut, hab Perl zwar noch nicht benutzt, aber...
    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>


    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)
    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>

    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...)
     
Thema:

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

Die Seite wird geladen...

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

  1. sendmail: cannot write ./dfkB2J4YdO031565 (eingehende mails)

    sendmail: cannot write ./dfkB2J4YdO031565 (eingehende mails): hi :) also. hab mir hier selbst ein mail auf meinen mailserver geschickt (von hotmail aus) und folgendes problem triff auf: ---------- Dec...
  2. Informationen in .semaphore packen & senden

    Informationen in .semaphore packen & senden: Hallo zusammen nach der für mich erfolglosen Suche im Internet nach passenden Informationen wende ich mich an Euch mit der Bitte mir in...
  3. Gewinnspiel: »Linux - Das umfassende Handbuch« zu gewinnen

    Gewinnspiel: »Linux - Das umfassende Handbuch« zu gewinnen: Zum 20. Jubiläum des Buches »Linux - Das umfassende Handbuch« von Michael Kofler aus dem Rheinwerk Verlag verlost Pro-Linux zehn Exemplare des...
  4. Mein Server Ubuntu 14.04.3 LTS versendet spam (postfix/dovecot)

    Mein Server Ubuntu 14.04.3 LTS versendet spam (postfix/dovecot): Mir wurde gerade von meinem Hoster mitgeteilt, daß mein Server bai abusix.org geblacklistet wurde. Wenn ich in die logs schaue, so sehe ich z.B.:...
  5. thunderbird plugin für unterschiedliche mail absender (postifx)

    thunderbird plugin für unterschiedliche mail absender (postifx): rm me rm me:devil: