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

Modules Perl Discussion :

Socket TCP en background ? (ou continuer le script après)


Sujet :

Modules Perl

  1. #1
    Membre régulier
    Homme Profil pro
    Ingénieur Systèmes
    Inscrit en
    Août 2011
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Monaco

    Informations professionnelles :
    Activité : Ingénieur Systèmes
    Secteur : Finance

    Informations forums :
    Inscription : Août 2011
    Messages : 75
    Points : 87
    Points
    87
    Par défaut Socket TCP en background ? (ou continuer le script après)
    Bonjour,

    Je m'explique (je suis un peu débutant en perl)

    Globalement mon soucis est le suivant :

    j'essaye de scripter un programme qui écoute sur un socket tcp (ça marche très bien), le soucis, c'est que le code après le socket n'est pas exécuté.

    je voudrais simplement que mon programme lance la première partie du script, puis le serveur TCP en écoute, puis continue dans son script original.

    malheureusement je ne peux pas séparer les programmes, car les clients du socket doivent envoyer des messages qui doivent être interprétés par le reste du script..

    bon ça paraît compliqué à expliquer tout ça, voici le contenu avec plus de détails :

    - globalement j'essaye de scripter un "bot" pour IRC avec le module Net::IRC (ça marche très bien)
    - en parallèle je voudrais que mon script de bot écoute sur un socket TCP, afin que je puisse m'y connecter en telnet, balancer des messages qui puissent être affichés sur le chat (envoyés a bot).

    le soucis, c'est que j'arrive à faire l'un ou l'autre, mais pas les deux.
    j'ai trouvé un moyen d'en faire "une partie", en faisant la connexion au serveur IRC (c'est surement une connexion socket aussi d'ailleurs), puis en mettant mon serveur TCP dans un évènement de la première connexion (on_connect). là le bot se connecte, mon serveur tcp écoute, je peux balancer des messages etc.. le soucis, c'est que je ne sais pas quoi faire de ces messages, à priori, je ne peux les utiliser que dans la boucle du client tcp :p

    avez-vous une solution ? (threads ou autre ?)

    voici le code au cas ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
     
    #!/usr/bin/perl
     
    use IO::Socket::INET;
    use Net::IRC;
    use threads;
     
    $server_port=3000;
     
    my $server = 'irc.underworld.no';
    my $nick = 'testbot';
    my $ircname = 'Bot IRC Perl';
    my $username = 'testperlBot';
    my $version = '1.0';
    my $channel = '#monchantest';
     
    my $irc = new Net::IRC;
     
    my $conn = $irc->newconn(
        'Server'      => $server,
        'Port'        => 6667,
        'Nick'        => $nick,
        'Ircname'     => $ircname,
        'Username'    => $username
    );
     
    $conn->add_handler('376', \&on_connect);
    $conn->add_handler('public', \&on_public);
     
    $irc->start();
     
     
    sub on_connect
    {
        my ($conn, $event) = @_;
     
        $conn->join($channel);
        $conn->privmsg($channel, 'Hello !');
     
        $mau = IO::Socket::INET->new(LocalPort => $server_port,
                                    Type      => SOCK_STREAM,
                                    Reuse     => 1,
                                    Listen    => 10 )
            or die "Couldn't be a tcp server on port $server_port: $!\n";
     
            $SIG{CHLD} = 'IGNORE';
     
            while ($client = $mau->accept()) {
                    $pid = fork;
                    unless ($pid)
                    {
                            while (1) {
                            print $client "message ? : ";
                            $text=<$client>;
                            if ($text =~ "quit" ) {
                                    #close($client);
                                    $client->shutdown ( 2 );
                            } else {
                                    print $text; # je veux envoyer ce texte dans le on_public du dessous (qui n'est jamais exécuté)
                            }
                    }
                    }
     
            $text="";
            undef($text);
            }
            close($mau);
     
     
        $conn->{'connected'} = 1;
    }
     
     
    sub on_public
    {
        my ($conn, $event) = @_;
        my $text = $event->{'args'}[0];
        print "<" . $event->{'nick'} . ">\t| $text\n";
    }
    merci pour vos lumières

    Olivier

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 41
    Points : 36
    Points
    36
    Par défaut
    Bonjour Olivier,

    je n'ais jamais utilisé le module cependant,

    Dans la documentation du module j'ai vu
    addfh()

    This sub takes a user's socket or filehandle and a sub to handle it with and merges it into do_one_loop()'s list of select()able filehandles. This makes integration with other event-based systems (Tk, for instance) a good deal easier than in previous releases.

    Takes at least 2 args:

    0.

    A socket or filehandle to monitor
    1.

    A reference to a subroutine. When select() determines that the filehandle is ready, it passes the filehandle to this (presumably user-supplied) sub, where you can read from it, write to it, etc. as your script sees fit.
    2.

    Optional: A string containing any combination of the letters r, w or e (standing for read, write, and error, respectively) which determines what conditions you're expecting on that filehandle. For example, this line select()s $fh (a filehandle, of course) for both reading and writing:

    $irc->addfh( $fh, \&callback, "rw" );
    après
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $irc->addfh( $client, \&fonction )
    faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print $client "message ? : \n";
    ou envoyer du texte avec un client telnet devrai si je comprend bien appeler la fonction, en utilisant telnet il me semble que tu n'aurais même pas besoin de gérer de processus supplémentaire dans ton code.

    remarque sur ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                            print $client "message ? : ";
                            $text=<$client>;
    est bloquant selon moi car tu n'a pas mis le saut de ligne à la fin du message et <$client> est en attente de ce saut de ligne.

    bonne continuation.

    Nicolas.

Discussions similaires

  1. attendre la fin de chargement d'une page avant de continuer le script
    Par jibouze dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 07/06/2006, 09h50
  2. socket TCP
    Par fxp17 dans le forum C++
    Réponses: 6
    Dernier message: 28/11/2005, 09h55
  3. [SOCKET] TCP : select devant send();
    Par trois_1 dans le forum Développement
    Réponses: 4
    Dernier message: 02/03/2004, 18h10
  4. [socket][tcp] jeu en reseau
    Par souris_sonic dans le forum Développement
    Réponses: 2
    Dernier message: 30/05/2003, 07h31
  5. transfert d'un fichier bitmap en socket tcp
    Par localhost dans le forum C++Builder
    Réponses: 5
    Dernier message: 29/07/2002, 00h40

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