En fin de compte, je me suis facilité la tache en ouvrant 2 invite de commande.
Une qui écoute et une qui envoi les message.
(je ne suis pas parvenu a faire le tout en un)
Donc voici le résultat:
Servuer: test2.pl:
Client d'écoute: chat3.pl:
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132 use IO::Select; use IO::Socket; use Digest::MD5 qw(md5_hex); use MIME::Base64; my $boolStopTransmission = 0; my @tabCli; #repertorie l'ensemble des socket de mes clients my $k = -1; my $finalPers = ""; my $finalMess = ""; my $md5 = ""; my $mess_rep2; my @ready; my $flag1 = 0; #ce flag me ser lors d'un test qui verifie #si un client n'est pas deja present dans @tabCli $lsn = new IO::Socket::INET( Listen => 1, LocalPort => 7070 ); $sel = new IO::Select($lsn); $tabCli[0] = "JemetUneValeurCarJaiUnForeachQuiNecessiteQueMonTableauNeSoitPasVide"; while ( @ready = $sel->can_read ) { foreach $fh (@ready) { if ( $fh == $lsn ) { $new = $lsn->accept; $sel->add($new); print "*** Connexion d'un nouvel utilisateur ***\n"; #print "tabCli0=$tabCli[0]\n"; } else { # Process socket foreach (@tabCli) { #pour chaque client répertorié dans le tableau if ( $_ == $fh ) { #s'il est deja present, alors le flag passe a 1 $flag1 = 1; } } if ( $flag1 == 0 ) { #si le flag est egale a 0 alors le client n'existe pas dans le tableau donc je le rajoute $k = $k + 1; $tabCli[$k] = $fh; $mess_rep2 = "\n\n !!! Bienvenue sur le chatt IRC du CA-CIB !!!\n\n"; print $fh $mess_rep2; } $flag1 = 0; my $rep = <$fh>; print $rep; $rep = decode_base64($rep); #dechifrage du code #$i = $i + 1; $res1 = $rep; ( $finalPers, $finalMess, $md5, $boolStopTransmission ) = ( $res1 =~ /(.+) XyX (.+) XyX (.+) XyX (.+)/ ) ; #parsing du message my $md5Verif = md5_hex($finalMess); #Verification (CRC) grace a un MD5 if ( $md5Verif eq $md5 ) { #Verification CRC OK if ( $boolStopTransmission eq "1" ) { foreach my $it (@tabCli) { #pour chaque client de @tabCli, j'envoi le message $mess_rep2 = "*** $finalPers a interrompu la communication ***\n"; #print "tabCli0=$tabCli[0]\n"; print $it $mess_rep2; } print "\n*** $finalPers a interrompu la communication ***\n"; } else { foreach my $it (@tabCli) { #pour chaque client de @tabCli, j'envoi le message $mess_rep2 = "$finalPers$finalMess\n"; #print "tabCli0=$tabCli[0]\n"; print $it $mess_rep2; } print "\n$finalPers$finalMess\n"; } } else { #Verification CRC KO print "Le message suivant a été altéré lors du transfert sur le reseau:"; if ( $boolStopTransmission eq "1" ) { foreach my $it (@tabCli) { #pour chaque client de @tabCli, j'envoi le message $mess_rep2 = "*** $finalPers a interrompu la communication ***\n"; #print "tabCli0=$tabCli[0]\n"; print $it $mess_rep2; } print "\n*** $finalPers a interrompu la communication ***\n"; } else { foreach my $it (@tabCli) { #pour chaque client de @tabCli, j'envoi le message my $mess_rep2 = "$finalPers$finalMess\n"; #print "tabCli0=$tabCli[0]\n"; print $it $mess_rep2; } print "\n$finalPers$finalMess\n"; } } } } }
Et client d'ecriture: chat2.pl:
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 #Ce code en PERL est un client chatt. #Pour utiliser ce code, ouvrez l invite de commande, placez vous dans le repertoire #ou est le fichier et ecrivez la commande: #"pearl Chat2.pl" #exemple: "perl D:\Data\Chat2.pl" #Commande detail: #D:\BENJAMIN>"d:\Appli portable\Eclipse_3.5.1\Data\ActivePerl-5.12.2.1202-MSWin32-x86-293621\perl\bin\perl.exe" Chat2.pl #!/usr/bin/perl #use warnings; use strict; use IO::Socket; use IO::Socket qw(:crlf); use IO::Select; my $sock = IO::Socket::INET->new( #Connection PeerAddr => 'localhost', PeerPort => '7070', Proto => 'tcp', ) or die "Failed : $@\n"; print "\n*** Connexion en cours...***\n"; print "*** Connexion etablie ***\n"; my $sockets = IO::Select->new($sock); $sock->send( "ICAgICBYeVggICBYeVggNzIxNWVlOWM3ZDlkYzIyOWQyOTIxYTQwZTg5OWVjNWYgWHlYIDA=" ); printf $sock "\n"; forever: while () { foreach my $io ( $sockets->can_read() ) { chomp( my $msg = <$io> ); print "$msg\n"; } } close($sock); print "*** Fin de connexion ***\n";
Suite client d'ecriture: chat2.pm
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125 #Ce code en PERL est un client chatt. #Pour utiliser ce code, ouvrez l invite de commande, placez vous dans le repertoire #ou est le fichier et ecrivez la commande: #"pearl Chat2.pl" #exemple: "perl D:\Data\Chat2.pl" #Commande detail: #D:\BENJAMIN>"d:\Appli portable\Eclipse_3.5.1\Data\ActivePerl-5.12.2.1202-MSWin32-x86-293621\perl\bin\perl.exe" Chat2.pl #!/usr/bin/perl use threads; use threads::shared; #use warnings; use strict; use IO::Socket; use Chat2; use Digest::MD5 qw(md5_hex); use MIME::Base64; my $sock = IO::Socket::INET->new( #Connection PeerAddr => '10.146.232.106', PeerPort => '7070', Proto => 'tcp', ) or die "Failed : $@\n"; my $finalMess=""; my $md5=""; print "\n*** Connexion en cours...***\n"; print "*** Connexion etablie ***\n"; my $finalPers = personne(); #Renseigne nom et prenom de l'utilisateur my $stopvariable = " exit"; #my $stopvariable = # finCom(); #Renseigne le message qui indiquera au systeme la fin de la comm my $boolStopTransmission = 0; while ( $stopvariable ne my $finalMess ) { #Tant que le message fin de comm n'est pas saisi ( $finalMess, $md5 ) = message(); #if ( $stopvariable eq $finalMess ) { #Dernier message envoyé+fin de comm if ( $finalMess eq " exit" ) { #Dernier message envoyé+fin de comm $boolStopTransmission = 1; my $res = ("$finalPers XyX$finalMess XyX $md5 XyX $boolStopTransmission"); $res = encode_base64( $res, "" ); #chiffrement $sock->send("$res"); printf $sock "\n"; print "Vous avez interrompu la communication\n"; exit; } else { #envoi du message $boolStopTransmission = 0; my $res = ("$finalPers XyX$finalMess XyX $md5 XyX $boolStopTransmission"); $res = encode_base64( $res, "" ); #chiffrement $sock->send("$res"); printf $sock "\n"; #my $reponse = <$sock>; #print "réponse=$reponse\n"; } } close($sock); print "*** Fin de connexion ***\n"; ###################### Mes Sub #################### sub personne { my $prenom; my $nom; print "\nVotre prenom : "; $prenom = <STDIN>; chop($prenom); print "Votre Nom : "; $nom = <STDIN>; chop($nom); my $this = Chat2->constPers( "$nom", "$prenom" ); my $persTemp = ""; foreach ( keys(%$this) ) { $persTemp = $persTemp . " $$this{$_}"; } print "\n"; $persTemp=$persTemp.": "; return $persTemp; } sub message { my $finalMess = ""; print "\nMessage : "; my $messageTemp = <STDIN>; chop($messageTemp); my ( $this, $md5 ) = Chat2->constMess("$messageTemp"); #$this = substr($this, 1); $messageTemp = ""; foreach ( keys(%$this) ) { $messageTemp = $messageTemp . " $$this{$_}"; } return ( $messageTemp, $md5 ); } sub finCom { print "Message de fin de communication: "; my $stopvariableTemp = <STDIN>; chop($stopvariableTemp); $stopvariableTemp = " " . $stopvariableTemp; return $stopvariableTemp; }
Et voilou, merci encore a vous pjilou pour votre aide durant toute la réalisation de ce code .
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 package Chat2; use strict; use Digest::MD5 qw(md5_hex); sub constMess { my ( $classe, $message ) = @_; my $md5Temp = ""; my $this = { "Message" => $message, }; foreach ( keys(%$this) ) { my $md5Temp = $md5Temp = $md5Temp . " $$this{$_}"; } $md5Temp = substr( $md5Temp, 1 ); my $md5 = md5_hex("$md5Temp"); bless( $this, $classe ); return ( $this, $md5 ); } sub constPers { my ( $classe, $nom, $prenom, ) = @_; my $this = { "nom" => $nom, "prenom" => $prenom, }; bless( $this, $classe ); return $this; } 1;
(je continue de chercher pour la solution "tout-en-un",et vous tiens au courant si je trouve quelque chose)
Cordialement,
Benjamin
Partager