IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Programmation et administration système Perl Discussion :

ClientS Serveur broadcast sur les clients


Sujet :

Programmation et administration système Perl

  1. #1
    Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Finance

    Informations forums :
    Inscription : Février 2014
    Messages : 2
    Points : 2
    Points
    2
    Par défaut ClientS Serveur broadcast sur les clients
    Bonjour je fait de la supervision.
    Je souhaiterai mettre en place du suivi de logs temps réel avec déclenchement d'alerte sonore sur le client.

    le principe un serveur (en perl) follow des logs en cas de détection d'un pattern il broadcast à tous les clients le message.

    Ce(s) message(s) étant affichée dans un terminal j'arrive a l'afficher de différente couleur et a le faire biper putty sur le poste windows.

    le but étant d’éviter que 15 personnes ne se connectent sur le serveur de logs avec des tail custom

    voila je vous montre mon code qui malheureusement ne fonctionne pas

    client :
    #!/usr/bin/perl

    # Client.
    use IO::Socket;
    use Sys::Hostname;

    $| = 1;

    # Lecture du nom du serveur.
    # my $myself = hostname();
    my $myself = 'client';
    my $target_port = 3142;
    my $target_addr = '10.9.178.25';

    print 'Attempt to connect...'.$target_addr.':'.$target_port."\n";

    chomp($target_addr);

    # Creation du socket.

    $socket = IO::Socket::INET->new(
    Proto => 'tcp',
    Type => SOCK_STREAM,
    PeerAddr => $target_addr,
    PeerPort => $target_port,
    TimeOut => 5) or die 'Unable to connect to server '."\n";

    $socket->autoflush(1);

    # print ' connection established'."\n";

    $pid = fork;
    die 'unable to fork client !'."\n" unless defined ($pid);
    if ($pid == 0) {
    # Le fils envoie les donnees au serveur
    # print $myself.'$'."\n";
    while ($ligne = <>) {
    if ($ligne) {
    print $socket $ligne;
    }
    }
    } else {
    # Le pere recoit les donnees du serveur
    while ($ligne = <$socket>) {
    if ($ligne) {
    print 'msg from server : '.$ligne;
    }
    }
    }
    $socket->close();
    while (1) {
    print "\a".'connection lost !'."\n";
    sleep(5);
    print "\a".'connection lost !'."\n";
    }
    le serveur :

    #!/usr/bin/perl
    # Serveur.

    $| = 1;

    use IO::Socket;
    use IO::Select;
    use Sys::Hostname;
    use Term::ANSIColor;

    # http://perldoc.perl.org/Term/ANSIColor.html
    # http://perldoc.perl.org/IO/Select.html

    # Creation du socket.
    my $myself = hostname();
    my $listening_addr = '10.9.178.25';
    my $listening_port = 3142;

    $main_socket = IO::Socket::INET->new(
    LocalHost => $listening_addr,
    LocalPort => $listening_port,
    Proto => 'tcp',
    Type => SOCK_STREAM,
    Reuse => 1,
    Listen => 5) or die 'Unable to listen on socket : '.$!."\n";
    print 'Server started on : '.$listening_addr.':'.$listening_port."\n";
    print 'waiting for clients...'."\n";

    $main_socket->autoflush(1);

    $readable_handles = new IO::Select();
    $readable_handles->add($main_socket);

    while (1) { #Infinite loop
    # select() blocks until a socket is ready to be read or written
    ($new_readable) = IO::Select->select($readable_handles, undef, undef, 0);
    # If it comes here, there is at least one handle
    # to read from or write to. For the moment, worry only about
    # the read side.
    foreach $sock (@$new_readable) {
    $sock->autoflush(1);
    if ($sock == $main_socket) {
    $new_sock = $sock->accept();
    print $new_sock 'msg from server : connection established !';
    # Add it to the list, and go back to select because the
    # new socket may not be readable yet.
    $name = gethostbyaddr($new_sock->peeraddr, AF_INET);
    $peer_addr = $new_sock->peerhost();
    $peer_port = $new_sock->peerport();
    print 'new client : '.$name.'@'.$peer_addr.':'.$peer_port."\n";
    $readable_handles->add($new_sock);
    } else {
    # It is an ordinary client socket, ready for reading.
    $sock->autoflush(1);
    $pid = fork;
    die 'unable to fork client !' unless defined ($pid);
    if ($pid ==0) {
    # Le fils recoit les donnees du client.
    $buf = <$sock>;
    if ($buf) {
    $name = gethostbyaddr($sock->peeraddr, AF_INET);
    $peer_addr = $sock->peerhost();
    $peer_port = $sock->peerport();
    if ( $name eq 'mschapi-bb' ) {
    print color("MAGENTA"),'msg from : '.$name.'@'.$peer_addr.':'.$peer_port.' : '.$buf,color("reset");
    } elsif ( $name eq 'mschapo-bb' ) {
    print color("CYAN") ,'msg from : '.$name.'@'.$peer_addr.':'.$peer_port.' : '.$buf,color("reset");
    } else {
    print 'msg from : '.$name.'@'.$peer_addr.':'.$peer_port.' : '.$buf;
    }
    # print $sock 'koukou';
    # print $sock ' connection established !';
    } else {
    # Client closed socket. We do the same here, and remove
    # it from the readable_handles list
    $name = gethostbyaddr($sock->peeraddr, AF_INET);
    $peer_addr = $sock->peerhost();
    $peer_port = $sock->peerport();
    # Attention boucle infinie possible ici...
    print 'client has gone away : '.$name.'@'.$peer_addr.':'.$peer_port."\n";
    $readable_handles->remove($sock);
    close($sock);
    }
    } else {
    # Le pere envoie les donnees au client.
    while ($ligne = <>) {
    if ($ligne) {
    foreach $sock (@$new_readable) {
    $sock->autoflush(1);
    print $sock color("red"),$ligne,color("reset");
    # print $sock "\a".$ligne;
    # print $sock $ligne;
    }
    }
    }
    # ca marche ?
    #$readable_handles->remove($sock);
    #close($sock);
    }
    }
    }
    }
    $sock->close();
    $main_socket->close();
    Actuellement j'arrive depuis les clients a :
    - connecter au serveur
    - me déconnecter proprement
    - envoyer des messages au serveur
    - recevoir des messages du serveur

    la c'est ok

    j'arrive depuis le serveur j'arrive a :
    - détecter les nouvelles connections
    - détecter les fin de connections (client has gone)
    - identifier clairement de qui le message proviens (et le faire apparaitre en couleur)

    la seule chose que je maitrise pas c'est que les messages envoyé depuis le serveur arrivent aléatoirement sur les clients
    et seulement un seul client recoi les messages du serveur alors que je voudrait que le serveur broadcast sur tout les clients quel qu’en soit leurs nombres


    merci de vos remarques

  2. #2
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    pas sûr du tout que je puisse t'aider sur ce genre du problème, mais deux remarques qui pourraient nous aider à t'aider:
    - Mets ton code entre des balises code (le bouton # au-dessus de la fenêtre d'édition), cela le rendrait beaucoup plus lisible;
    - Le code "ne fonctionne pas" est une description très pauvre de ton problème. Essaie d'expliquer ce que tu arrives à faire, ce qui semble marcher et ne semble pas marcher, ce qui se passe, où ça s'arrête, etc., tous les éléments permettant de mieux cibler la recherche.

    Par ailleurs, il existe des modules réseau de plus haut niveau que les sockets et tout ça, il doit bien y en avoir un correspondant à ton besoin.

  3. #3
    Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Finance

    Informations forums :
    Inscription : Février 2014
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par Lolo78 Voir le message
    Bonjour,

    pas sûr du tout que je puisse t'aider sur ce genre du problème, mais deux remarques qui pourraient nous aider à t'aider:
    - Mets ton code entre des balises code (le bouton # au-dessus de la fenêtre d'édition), cela le rendrait beaucoup plus lisible;
    - Le code "ne fonctionne pas" est une description très pauvre de ton problème. Essaie d'expliquer ce que tu arrives à faire, ce qui semble marcher et ne semble pas marcher, ce qui se passe, où ça s'arrête, etc., tous les éléments permettant de mieux cibler la recherche.

    Par ailleurs, il existe des modules réseau de plus haut niveau que les sockets et tout ça, il doit bien y en avoir un correspondant à ton besoin.
    merci de votre remarque
    il est évident que vous aviez raison...

Discussions similaires

  1. Réponses: 1
    Dernier message: 23/05/2011, 11h51
  2. [debutant][Client-serveur] Question sur les sockets
    Par skwi6 dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 06/11/2006, 15h04
  3. Réponses: 1
    Dernier message: 30/05/2005, 17h02
  4. Client-Serveur Dcom = Client+Serveur lancés sur la machine ?
    Par Jilam dans le forum Bases de données
    Réponses: 6
    Dernier message: 27/07/2004, 14h55
  5. Socket:Envoyer du texte d'un serveur vers tout les clients
    Par cedm78 dans le forum Web & réseau
    Réponses: 7
    Dernier message: 01/08/2002, 16h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo