2011-06-28 6 views
2

Est-il possible de créer une connexion de socket à un port ouvert sur un périphérique final?Connexion de socket Perl

Si la connexion tombe, imprimez quelque chose?

J'ai vu quelques exemples mais ils nécessitent un script de type serveur et un client, juste à la recherche d'un client.

Merci

+0

Si je dis se connecter au port 23 par exemple, va travailler l'arrêt du serveur telnet? Je viens de tester ce sokething avec le port 80 et le script était en cours d'exécution après que je l'ai tué ... – mrlayance

Répondre

6

Perl a prises directement intégré à elle. Vous avez juste besoin de charger le module standard Socket.pm pour obtenir les constantes dont vous avez besoin. La page de manuel perlipc vous explique tout cela Cependant, il existe de nombreux modules de niveau supérieur qui sont plus faciles à utiliser que les modules intégrés. Certains sont même standard.

Voici un exemple CLI:

% perl -MIO::Socket::INET -E '$him = new IO::Socket::INET "localhost:daytime" // die; print while <$him>' 
Tue Jun 28 08:17:13 2011 
+0

Est-ce que '0' est un retour valide de' IO :: Socket :: INET-> new'? Cela ne semble pas être le cas. – Axeman

+0

@Axeman, non. Les constructeurs devraient toujours retourner vrai. '||' suffit. – tchrist

0

Une variante de cela pourrait répondre à vos besoins:

use strict; 
use warnings; 
use constant 
    { SOCKET_ERROR_MESSAGE => 'Some socket error message right here!' 
    , YOU_WANT_TO   => 1 
    }; 

use IO::Select; 
use IO::Socket::INET; 

@ARGV = qw<server.domain.tld 8080> unless @ARGV; 

sub handle_server_message { 
    ... 
} 

my $sel 
    = IO::Select->new(
     IO::Socket::INET->new( 
     PeerAddr => shift 
    , PeerPort => shift 
    )); 

# block until the server sends something that can be read. 
while (my ($sock) = $sel->can_read) { 
    # you could just do this with $sock->eof... 
    if ($sock->error and $sock->eof) { 
     die MY_ERROR_MESSAGE if YOU_WANT_TO; 
     print MY_ERROR_MESSAGE; 
    } 
    else { 
     handle_server_message($sock); 
    } 
}