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 133 134 135 136 137 138 139 140 141
| #Ce code en PERL est un serveur chatt
#Pour utiliser ce code, ouvrez l invite de commande, placez vous dans le repertoire
#que vous voulez analyser et ecrivez la commande:
#"pearl EMPLACEMENT_DU_FICHIER_CALCUL_TAILLE_DOSSIER"
#exemple: "perl D:\Data\calcul_taille_dossier.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" Calcul_taille_dossier.pl
#!/usr/bin/perl
use threads;
use threads::shared;
use warnings;
use strict;
use IO::Socket;
use Digest::MD5 qw(md5_hex);
use MIME::Base64;
my $serveur = IO::Socket::INET->new( #Connection
LocalHost => '10.146.232.106',
LocalPort => '7070',
Proto => 'tcp',
Listen => 1,
Reuse => 1,
)
or die "Impossible serveur tcp sur le port 10000 : $@\n";
my @res1 = {}; #tableau qui recupere les messages du client
my $i = 0; #compteur
my $j : shared = -1; #compteur
my $boolStopTransmission = 0; #bollean de fin de transmission
my $mess_rep = "";
my $client = "";
my $tempClient = "";
my @listecli : shared; #tableau qui recupere la liste des clients
while ( $client = $serveur->accept() ) { #pour chaque nouvele connection
#$tempClient = $client;
#print "Avant Threads TempClient=$tempClient\n";
#print "Avant Threads Client=$client\n";
#print "Avant Threads J=$j\n";
my $thr2 = threads->new( \&recupClient, "$client" );
next if my $pid = fork;
close($serveur);
print "*** Connexion d'un nouvel utilisateur ***\n";
$mess_rep = "Bienvenue sur le Chatt100 !\n";
print $client $mess_rep;
while ( my $rep = <$client> ) { #Pour chaque message du client
my $rep = decode_base64($rep); #dechifrage du code
$i = $i + 1;
$res1[$i] = $rep;
my ( $finalPers, $finalMess, $md5, $boolStopTransmission ) =
( $res1[$i] =~ /(.+) 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" ) {
print "*** $finalPers a interrompu la communication ***\n";
exit;
}
else {
my $thr1 =
threads->new( \&subEnvoiMessage, "$finalPers", "$finalMess" );
#subEnvoiMessage("$finalPers", "$finalMess");
my $mess_rep2 = "$finalPers: $finalMess\n";
print $client $mess_rep2;
#print $client "\n$finalPers a envoyé : $finalMess\n";
print "\n$finalPers vous envoi : $finalMess\n";
}
}
else { #Verification CRC KO
print
"Le message suivant a été altéré lors du transfert sur le reseau.";
if ( $boolStopTransmission eq "1" ) {
print "$finalPers a interrompu la communication\n";
}
else {
print "\n$finalPers vous envoi : $finalMess\n";
}
}
}
continu {
close($client);
}
}
$SIG{CHLD} = 'IGNORE'; #pour eviter les problemes de differents OS
###################### Mes Sub ####################
sub recupClient {
my ( $tempClient, $client3 ) = @_;
$j = $j + 1;
#print "Pendant Threads tempClient=$tempClient\n";
#print "Pendant Threads J=$j\n";
$listecli[$j] = $tempClient;
#print "Dans le thread1\n";
#for ( my $k = 1 ; $k < @listecli ; $k++ ) {
# print "k=$k";
#print "0=$listecli[0]\n";
#print "1=$listecli[1]\n";
#print "2=$listecli[2]\n";
#}
}
sub subEnvoiMessage {
my ( $finalPers, $finalMess ) = @_;
#print "Dans le thread2\n";
my $tailletab = @listecli;
for ( my $k = 0 ; $k < $tailletab ; $k++ ) {
#print "k=$k\n";
#print "taille=$tailletab\n";
my $mess_rep2 = "$finalPers: $finalMess\n";
my $client = $listecli[$k];
#print "Pendant Threads client=$client\n";
#print "Pendant Threads mess_rep2=$mess_rep2\n";
print $client $mess_rep2;
}
} |
Partager