2016-09-12 1 views
8

Ich programmiere einen einfachen Code-Socket-Verbindung in Perl mit:Überprüfen Sie, ob Steckdose, bevor das Senden von Daten verbunden ist

$sock = new IO::Socket::INET(
        PeerAddr => '192.168.10.7', 
        PeerPort => 8000, 
        Proto => 'tcp'); 
$sock or die "no socket :$!"; 

Dann werden die Daten mit einer Schleife zu senden:

while... 
print $sock $str; 
...loop 

Gibt es eine Möglichkeit zu Fügen Sie in die Schleife einen Befehl ein, um die Verbindung zu überprüfen. Etwas wie:

while... 
    socket is up? 
    yes => send data 
    no => connect again and the continue with loop 
...loop 

EDIT MY CODE ADD:

my $sock = new IO::Socket::INET(
        PeerAddr => '192.168.10.152', 
        PeerPort => 8000, 
        Proto => 'tcp'); 
    $sock or die "no socket :$!"; 

    open(my $fh, '<:encoding(UTF-8)', 'list1.txt') 
     or die "Could not open file $!"; 

    while (my $msdn = <$fh>) { 
     my $port="8000"; 
     my $ip="192.168.10.152"; 
     unless ($sock->connected) { 
      $sock->connect($port, $ip) or die $!; 
    } 
    my $str="DATA TO SEND: " . $msdn; 
    print $sock $str; 
    } 
    close($sock); 

Antwort

13

IO::Socket::INET ist eine Unterklasse von IO::Socket, die eine connected method hat.

Wenn sich der Socket in einem verbundenen Zustand befindet, wird die Peeradresse zurückgegeben. Wenn der Socket nicht verbunden ist, wird Undef zurückgegeben.

Sie können, dass in der Schleife verwenden und call connect auf es, wenn der Scheck zurück undef.

my $sock = IO::Socket::INET->new(
    PeerAddr => '192.168.10.7', 
    PeerPort => 8000, 
    Proto => 'tcp' 
); 
$sock or die "no socket :$!"; 

while (1) { 
    unless ($sock->connected) { 
     $sock->connect($port, $ip) or die $!; 
    } 
    # ... 
} 
+2

ja, aber das ist nicht immer genug http://perldoc.perl.org/IO/Socket.html#connected (auch Rückgabewert von 'überprüfen soll -> write()') –

+0

Sorry, aber ich verstehe nicht. Ich habe bereits eine Schleife, um eine Datei Zeile für Zeile zu lesen und dann innerhalb der Schleife Daten an den Server zu senden. Dies funktioniert perfekt, aber, wenn aus irgendwelchen Gründen, der Server die Verbindung zu schließen, Beenden der Anwendung ohne Ende alle Zeilen zu senden. Ich verstehe nicht, wie kann ich implementieren: $ socket-> connect, wenn $ socket-> connected; in einer Art und Weise kann ich wieder einen Socket erstellen (erneut verbinden), bevor Sie weiter Daten aus der Schleife senden. –

+0

@LucasRey Ich glaube nicht, dass Sie einen neuen Socket erstellen müssen. Sie wollen nur wieder verbinden, was diese Zeile tut. Setzen Sie es an den Anfang der Schleife (mein 'while (1)' war nur so, dass es im Beispiel eine Schleife gibt) und schreibe danach. Das sollte es tun. – simbabque

Verwandte Themen