TP Programmation réseau



Envoi de mails

Vérifier (avec la commande whereis sendmail) que votre machine comporte bien le MTA (=mail transport agent) sendmail. Si c'est le cas, on peut alors l'utiliser dans un script comme agent d'expédition en adressant sur son entrée standard une chaine correcte.
Rien de plus facile que d'envoyer des messages ! Pour cela il suffit d'ouvrir un fichier en écriture vers sendmail à travers un pipe. Bien respecter le format, contraignant, du courrier !
Voici un exemple à adapter et à tester :
#!/usr/bin/perl

print "Essai d'envois de mails\n";
$destinataire="nom ";
$nom = $destinataire;
$nom =~ s/^\s*(\w+)\s+<.*$/$1/;
$expediteur="....";
$repondre="....";

# option -t pour que sendmail intégre les en-têtes fournies
open(MAIL,"|/usr/lib/sendmail -t") or die "impossible 
d'expédier par sendmail !";

# attention : bien observer la syntaxe de cette chaine
# un seul passage à la ligne (ou \n) entre chaque en-tete
# un : après chaque mot-clé
$message="From: $expediteur
To: $destinataire\nReply-To: $repondre
Subject: Salut !
Bonjour $nom
Le stage n'est pas trop dur ?
Comment vas-tu aujourd'hui ?

xxx";
print MAIL $message;
close MAIL;

Exemple de session FTP

Avec le module Net::FTP, on dispose avec une notation orientée-objet de fonctions de base permettant d'ouvrir une connexion FTP dans un programme Perl et d'y travailler de la meme façon qu'avec un client
Voici un script sommaire, permettant de récupérer la page ftp://ftp.cpan.org/pub/CPAN/CPAN.html
#!/usr/bin/perl -w
use Net::FTP;
# tenter une connexion, et obtenir un identifiant de connexion
# dans le jargon objet, il s'agit de la construction d'un objet noté ici $ftp
# tant que la session reste ouverte, on adresse des méthodes à cet objet : login,cwd,get,put ..
# documentation à consulter : perldoc Net::FTP
#####################################################
$ftp = Net::FTP -> new (
 "ftp.cpan.org",
  Passive =>1 )
  Timeout => 30
  ) or die "Connexion impossible\n";
$ftp-> login("anonymous","jean") or die "connexion impossible";
$ftp-> cwd('/pub/CPAN');
$fichier= "CPAN.html";
$local = "cpan.html";
$ftp-> get($fichier, $local) or die "Impossible d'obtenir $fichier !";
# on obtient la page d'accueil : http://www.cpan.org/CPAN.html

Introduction aux sockets

Il ne s'agit ici que d'une brève introduction, en grande partie issue de l'indispensable référence :
http://www.enstimac.fr/Perl/DocFr/perlipc.html

  TP

################ daytime.pl : client du service daytime ############

###################### navig.pl : mini client HTTP #######################

Il s'agit de se connecter à un serveur WEB (port 80) dont l'adresse est demandée (ou bien passé en paramètre) et d'obtenir la page d'accueil du serveur WEB. En particulier on expérimente le comportement bidirectionnelle de la socket : le client émet l'instruction HTTP puis se met à l'écoute.
Remarques :
  1. l'adresse du document doit être absolue par rapport à la racine du web, par exemple /index.html (ne pas oublier le /)
  2. la commande à adresser au serveur est "GET $document HTTP/1.0\n\n", conformément au protocole HTTP
  3. Compléter le source. Tester d'abord en demandant la page d'accueil du serveur apache de la machine voisine
  4. modifier le programme pour enregistrer sur disque la page d'accueil de Créteil (si vous voulez l'ip : nslookup www.ac-creteil.fr)
Prolongement
Ecrire maintenant webget.pl, à partir de navig.pl, permettant d'enregistrer localement dans le répertoire personnel, les pages dont les adresses auront été obtenues soit par dialogue, soit par passage de paramètre sur la ligne de commande.
#!/usr/bin/perl -w
# appel : navig.pl adresse-ip
#############################
use IO::Socket;
print "nom ou adresse IP du serveur WEB (par défaut créteil) : ";
$web = <>; chomp($web);
$web= "www.ac-creteil.fr" if $web eq "";
print "Document (par défaut ..) : ";
$doc = <>; chomp($doc);
$doc= "/util/programmation/perl/cours/tp-introduction.html" if $doc eq "";

$sock = IO::Socket::INET->new(
	...........
	..........,
	...........
	)
  or die "connexion impossible au port 80 sur $web";
$sock -> autoflush(1);
# envoi, par socket, de la requete HTTP habituellement envoyée par le navigateur
print $sock "GET $doc HTTP/1.0\n\n";
print "Voici le document $doc sur $web\n";
while ( <$socket> ) {
 print;
}

################ Programmer un dialogue interactif client-serveur ###############