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
merci pour vos lumières
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"; }
Olivier
Partager