Réseau et Communication Notes de Cours/TD/TP autorisées; autres documents, calculettes, ordinateurs interdits.



Documents pareils
Couche application. La couche application est la plus élevée du modèle de référence.

Communication par sockets

Applications client/serveur TCP/IP - Sockets Rappels. C.Crochepeyre Applications CS 1

Programmation système de commandes en C

Divers éléments. Protocoles d'applications. Un agent Utilisateur. MUA - Agents Utilisateurs de Courriel. Simple Mail Transfer Protocol

Chapitre : Les Protocoles

FTP & SMTP. Deux applications fondamentales pour le réseau Internet.

Programmation système I Les entrées/sorties

Protocoles Applicatifs

Principe de la messagerie électronique

TP Protocoles SMTP et POP3 avec Pratiquer l algorithmique

DNS Server RPC Interface buffer overflow. Céline COLLUMEAU Nicolas BODIN

Exercice sur les Dockers

Quelques protocoles et outils réseaux

FTP & SMTP. File Transfert Protocol. Deux applications fondamentales pour le réseau Internet. Un protocole d échange de fichier «au dessus» de TCP :

Simulation d un système de paiement par carte bancaire

Les structures de données. Rajae El Ouazzani

Cours 6 : Tubes anonymes et nommés

Club informatique Mont-Bruno Séances du 18 janvier et du 17 février 2012 Présentateur : Michel Gagné

MISE A NIVEAU INFORMATIQUE LANGAGE C - EXEMPLES DE PROGRAMMES. Université Paris Dauphine IUP Génie Mathématique et Informatique 2 ème année

GUIDE D INSTALLATION INTERNET haute vitesse

Programmation système en C/C++

INFO-F-404 : Techniques avancées de systèmes d exploitation

USTL - Licence ST-A 1ère année Initiation à la programmation TP 1

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

Configuration de base de Jana server2. Sommaire

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

DUT Informatique Module Système S4 C Département Informatique 2009 / Travaux Pratiques n o 5 : Sockets Stream

Le système de gestion des fichiers, les entrées/sorties.

1. Fonctionnement de l Internet 2. Protocoles applicatifs 3. Programmation réseau

Dans le chapitre 1, nous associions aux fichiers ouverts des descripteurs de fichiers par lesquels nous accédions aux fichiers.

3IS - Système d'exploitation linux - Programmation système

Le prototype de la fonction main()

Cours CCNA 1. Exercices

Saisie sur un ordinateur OS/390 Ici sur jedi.informatik.uni-leipzig.de ou

Programmation Internet en Java

Volet de visualisation

Développement d un logiciel de messagerie instantanée avec Dotnet (version simplifiée)

Développement Web. Les protocoles

Présentation du modèle OSI(Open Systems Interconnection)

L3 informatique TP n o 2 : Les applications réseau

Introduction au langage C

PROJET ALGORITHMIQUE ET PROGRAMMATION II

Java Licence Professionnelle CISII,

[OUTLOOK EXPRESS WINDOWS MAIL]

Plateforme PAYZEN. Définition de Web-services

Définition des Webservices Ordre de paiement par . Version 1.0

Serveur de messagerie sous Debian 5.0

GENERALITES. COURS TCP/IP Niveau 1

18 TCP Les protocoles de domaines d applications

0.1 Mail & News : Thunderbird

PARAMETRER LA MESSAGERIE SOUS THUNDERBIRD

DNS et Mail. LDN 15 octobre DNS et Mail. Benjamin Bayart, Fédération FDN. DNS - fichier de zone. DNS - configuration

CONFIGURATION DE LA RECEPTION DES MAILS EN POPS.

Installation et utilisation du client FirstClass 11

Vous pouvez à présent à reconfigurer votre messagerie en cliquant ici.

WINDOWS NT 2000: Travaux Pratiques. -Boîtier partage d'imprimante- Michel Cabaré Janvier 2002 ver 1.0

Qu est ce qu un ?

TP3. Mail. Attention aux fausses manoeuvres lors de ce TP vous pouvez endommager votre mail sur ouindose.

Guide de configuration. Logiciel de courriel

Network musical jammin

Outils de l Internet

CENTRALE TELESURVEILLANCE VIA INTERNET WEB

OS Réseaux et Programmation Système - C5

Travaux Pratiques Introduction aux réseaux IP

Module Communication - Messagerie V6. Infostance. Messagerie

Cisco Certified Network Associate

Création, analyse de questionnaires et d'entretiens pour Windows 2008, 7, 8 et MacOs 10

Programmation client-serveur sockets - RPC

L3 informatique Réseaux : Configuration d une interface réseau

Guide Utilisateur - Guide général d'utilisation du service via Zdesktop ou Webmail v.8. Powered by. - media-2001.communication &.

CONTACT EXPRESS 2011 ASPIRATEUR D S

Informations sur l utilisation du webmail du CNRS. Webmail du CNRS. Manuel Utilisateur

Qu'est-ce que la messagerie électronique?

Installation et paramétrage de Fedora dans VirtualBox.

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

Fonctionnement du courrier électronique

Utiliser le service de messagerie électronique de Google : gmail (1)

Manuel de configuration des fonctions de numérisation

NOTICE INSTALLATION. ARCHANGE Simplex Office N&B/Couleur KONICA MINOLTA BUSINESS SOLUTIONS FRANCE

Document d accompagnement pour l utilisation du Cartable en ligne Lycée des Métiers Fernand LÉGER 2013/2014

Internet et Programmation!

Guide Utilisateur - Guide général d'utilisation du service via Zdesktop ou Webmail v.8. Powered by. Version EXOCA 1

(Fig. 1 :assistant connexion Internet)

TRAVAUX PRATIQUES Programmation Système Langage C / Système UNIX. 2 e année Génie Informatique

Algorithmique et Programmation, IMA

1 - Se connecter au Cartable en ligne

I-Fax (fax par Internet)

Cours Programmation Système

SOMMAIRE. 3. Comment Faire? Description détaillée des étapes de configuration en fonction du logiciel de messagerie... 3

TP1 - Prise en main de l environnement Unix.

Arguments d un programme

Cours de Programmation Impérative: Zones de mémoires et pointeurs

INSTALLATION DE WINDOWS 2000 SERVER POUR BCDI3. par. G.Haberer, A.Peuch, P.Saadé

Protection des protocoles

Messagerie électronique

Le service FTP. M.BOUABID, Page 1 sur 5

Tsoft et Groupe Eyrolles, 2005, ISBN :

Transport Layer Security (TLS) Guide de mise en œuvre. Version: 1.0

Transcription:

Département d Informatique Faculté des Sciences de Luminy Réseau et Communication Lundi 9 mai 2011 Durée 3h Licence MI, UE INF15, E. Thiel Notes de Cours/TD/TP autorisées; autres documents, calculettes, ordinateurs interdits. Vous pouvez appeler sans les recopier les fonctions de la boîte à outil réseau vues en TD. I. Envoi de courrier électronique en TCP/IP Les courriers électroniques, ou email, sont le plus souvent acheminés par le protocole SMTP (Single Mail Transfer Protocol). Ce protocole texte est très simple et sera détaillé dans la suite. Onseproposederéaliser encunclient mail, capabledeseconnecter auservice SMTP d unemachine (port 25 TCP/IP) et de lui transmettre le message dans le protocole SMTP. Le serveur courrier de cette machine traite la connexion, répond par des codes d erreurs, puis achemine le courrier : si le destinataire est en local, il écrit le email dans sa boîte de messagerie, sinon il contacte le serveur SMTP à l adresse du destinataire pour lui transmettre le message. 1) Écrire la fonction int connecter_au_serveur (char *serveur, int port) recevant en paramètres le nom d un serveur et un numéro de port. La fonction crée une socket TCP/IP, se connecte au port du serveur puis renvoie la socket connectée. Dans tous les cas d erreur, la fonction affiche le message d erreur approprié, ferme la socket si besoin et renvoie -1. 2) Écrire la fonction int envoyer_buf (int soc, char *buf, int len) recevant en paramètres une socket connectée soc, un buffer buf et une longueur len. La fonction écrit les len premiers caractères de buf dans la socket (avec autant d opérations d écriture que nécessaire). Elle renvoie 0 pour succès, -1 si erreur. 3) Le protocole SMTP est un protocole texte, que l on peut donc utiliser avec un simple telnet. Voici un exemple complet : $ telnet adr-serveur 25 HELO adr-client MAIL FROM: email-auteur RCPT TO: email-dest DATA Subject: sujet Ceci est le corps du message à envoyer.. QUIT $ Connected to adr-serveur 220 adr-serveur SMTP Ready 250 adr-serveur 250 Sender ok 250 Recipient ok 354 Enter mail, end with "." on a line by itself 250 Ok 221 Closing connection Connection closed by foreign host. Réseau et Communication, UE SIN5U3, Edouard Thiel CC BY-NC http://pageperso.lif.univ-mrs.fr/~edouard.thiel/ens/rezo/ 1

Dans cet exemple, on se connecte via telnet au serveur adr-serveur sur le port 25, on se présente comme le client adr-client, puis on décrit le courrier en donnant les informations suivantes : l adresse email-auteur de l auteur, l adresse email-dest du destinataire, le sujet et enfin le corps du message. Dans la colonne de gauche sont données les commandes tapées ($ désigne le prompt du shell), dans la colonne de droite figure l affichage obtenu (dont les réponses du serveur). Chaque ligne est terminée par un retour chariot \n, non représenté ici. Écrire la fonction int ecrire_commandes_smtp (int soc, char *nom_client, Email *e) recevant en paramètres une socket soc connectée au serveur SMTP, le nom du client nom_client, et le courrier e à envoyer. Ce courrier est décrit par le type suivant : typedef struct char *auteur, *destinataire, *sujet, *corps; Email; On supposera pour simplifier que les trois premières chaînes ne contiennent aucun retour chariot, mais on ne préjugera pas de la taille des chaînes. La fonction écrit toutes les commandes SMTP et informations nécessaires pour transmettre le courrier e au serveur (sans se préoccuper des réponses) à l aide de envoyer_buf. À la moindre erreur, la fonction s interrompt et renvoie -1. Un retour 0 signifie que la fonction a réussi. 4) Après la plupart des commandes, le serveur répond une ou plusieurs lignes, chacune terminée par un retour chariot \n. Chacune de ces lignes commence par un code à trois chiffres puis un message explicatif (les serveurs HTTP font de même). Le premier chiffre est le plus important : 2 signifie que la demande a été exécutée sans erreur, 3 que la demande est en cours d exécution, 4 indique une erreur temporaire, 5 que la demande n est pas valide et n a pas pu être traitée. Autrement dit, 2 et 3 valent succès, 4 et 5 erreur. Écrire la fonction int tester_erreur_smtp (char *ligne) recevant en paramètre une ligne terminée par un retour chariot. La fonction examine le premier chiffre du code, puis renvoie 0 si le code est un succès, -1 si le code est un échec. Dans ce dernier cas, la fonction affiche un message d erreur avec la ligne incriminée. 5) Écrire la fonction int lire_reponses_smtp (int soc) recevant en paramètre une socket connectée au serveur SMTP. La fonction lit toutes les réponses du serveur jusqu à la déconnexion, et pour chaque ligne détectée, teste les réponses SMTP. La fonction s interrompt à la première erreur détectée et affiche la ligne déclarant l erreur. La fonction renvoie 0 pour succès, -1 pour erreur. 6) Écrirelafonctionint envoyer_email (char *nom_serveur, int port, char *nom_client, Email *e) recevant en paramètres le nom nom_serveur d un serveur SMTP, le port du service SMTP, le nom nom_client du client et le courrier e. La fonction se connecte au serveur, écrit les commandes SMTP pour envoyer e, puis lit les réponses SMTP et enfin ferme la connexion. À la moindre erreur, la fonction s interrompt et renvoie -1. Elle renvoie 0 si tout s est bien passé. 7) Écrire le programme principal qui attend en arguments le serveur, le port, le client, l auteur, le destinataire, le sujet et le corps du message. Il envoie le courrier puis affiche un message de succès ou d échec, enfin se termine avec le code de sortie correspondant. Réseau et Communication, UE SIN5U3, Edouard Thiel CC BY-NC http://pageperso.lif.univ-mrs.fr/~edouard.thiel/ens/rezo/ 2

Correction Les fonctions de la boîte à outil réseau vues en TD peuvent être appelées sans les recopier. I. Envoi de courrier électronique en TCP/IP Les courriers électroniques, ou email, sont le plus souvent acheminés par le protocole SMTP (Single Mail Transfer Protocol). Ce protocole texte est très simple et sera détaillé dans la suite. Onseproposederéaliser encunclient mail, capabledeseconnecter auservice SMTP d unemachine (port 25 TCP/IP) et de lui transmettre le message dans le protocole SMTP. Le serveur courrier de cette machine traite la connexion, répond par des codes d erreurs, puis achemine le courrier : si le destinataire est en local, il écrit le email dans sa boîte de messagerie, sinon il contacte le serveur SMTP à l adresse du destinataire pour lui transmettre le message. 1) Écrire la fonction int connecter_au_serveur (char *serveur, int port) recevant en paramètres le nom d un serveur et un numéro de port. La fonction crée une socket TCP/IP, se connecte au port du serveur puis renvoie la socket connectée. Dans tous les cas d erreur, la fonction affiche le message d erreur approprié, ferme la socket si besoin et renvoie -1. int connecter_au_serveur (char *serveur, int port) struct sockaddr_in adr_cli, adr_ser; struct hostent *hp; int soc; /* Création d une socket domaine internet et mode connecté */ soc = socket (AF_INET, SOCK_STREAM, 0); if (soc < 0) perror ("socket ip"); return -1; /* Fabrication adresse du client */ adr_cli.sin_family = AF_INET; adr_cli.sin_port = htons (0); /* 0 pour attribution d un port libre */ adr_cli.sin_addr.s_addr = htonl(inaddr_any); /* Toutes les adr. locales */ /* Attachement socket à l adresse du client */ printf ("Attachement socket\n"); if (bor_bind_in (soc, &adr_cli) == -1) perror ("bind ip"); close (soc); return -1; /* Fabrication adresse du serveur */ adr_ser.sin_family = AF_INET; adr_ser.sin_port = htons (port); /* forme Network */ printf ("Résolution adr serveur...\n"); if ((hp = gethostbyname (serveur)) == NULL) /* h_errno, herror() */ herror ("gethostbyname ip"); close (soc); return -1; memcpy (&adr_ser.sin_addr.s_addr, hp->h_addr, hp->h_length); printf ("Connexion à %s...\n", serveur); if (bor_connect_in (soc, &adr_ser) < 0) perror ("connect"); close (soc); return -1; printf ("Connexion établie\n"); return soc; Réseau et Communication, UE SIN5U3, Edouard Thiel CC BY-NC http://pageperso.lif.univ-mrs.fr/~edouard.thiel/ens/rezo/ 3

2) Écrire la fonction int envoyer_buf (int soc, char *buf, int len) recevant en paramètres une socket connectée soc, un buffer buf et une longueur len. La fonction écrit les len premiers caractères de buf dans la socket (avec autant d opérations d écriture que nécessaire). Elle renvoie 0 pour succès, -1 si erreur. int envoyer_buf (int soc, char *buf, int len) int a = 0, b = len, k; printf ("Envoi de \"%s\"\n", buf); while (b-a > 0) k = write (soc, buf+a, b-a); if (k < 0) perror ("envoyer_buf: write"); return -1; a += k; 3) Le protocole SMTP est un protocole texte, que l on peut donc utiliser avec un simple telnet. Voici un exemple complet : $ telnet adr-serveur 25 HELO adr-client MAIL FROM: email-auteur RCPT TO: email-dest DATA Subject: sujet Ceci est le corps du message à envoyer.. QUIT $ Connected to adr-serveur 220 adr-serveur SMTP Ready 250 adr-serveur 250 Sender ok 250 Recipient ok 354 Enter mail, end with "." on a line by itself 250 Ok 221 Closing connection Connection closed by foreign host. Dans cet exemple, on se connecte via telnet au serveur adr-serveur sur le port 25, on se présente comme le client adr-client, puis on décrit le courrier en donnant les informations suivantes : l adresse email-auteur de l auteur, l adresse email-dest du destinataire, le sujet et enfin le corps du message. Dans la colonne de gauche sont données les commandes tapées ($ désigne le prompt du shell), dans la colonne de droite figure l affichage obtenu (dont les réponses du serveur). Chaque ligne est terminée par un retour chariot \n, non représenté ici. Écrire la fonction int ecrire_commandes_smtp (int soc, char *nom_client, Email *e) recevant en paramètres une socket soc connectée au serveur SMTP, le nom du client nom_client, et le courrier e à envoyer. Ce courrier est décrit par le type suivant : typedef struct char *auteur, *destinataire, *sujet, *corps; Email; Réseau et Communication, UE SIN5U3, Edouard Thiel CC BY-NC http://pageperso.lif.univ-mrs.fr/~edouard.thiel/ens/rezo/ 4

On supposera pour simplifier que les trois premières chaînes ne contiennent aucun retour chariot, mais on ne préjugera pas de la taille des chaînes. La fonction écrit toutes les commandes SMTP et informations nécessaires pour transmettre le courrier e au serveur (sans se préoccuper des réponses) à l aide de envoyer_buf. À la moindre erreur, la fonction s interrompt et renvoie -1. Un retour 0 signifie que la fonction a réussi. int ecrire_commandes_smtp (int soc, char *nom_client, Email *e) char *buf_v[100]; int buf_n = 0, i; buf_v[buf_n++] = "HELO "; buf_v[buf_n++] = nom_client; buf_v[buf_n++] = "\nmail FROM: "; buf_v[buf_n++] = e->auteur; buf_v[buf_n++] = "\nrcpt TO: "; buf_v[buf_n++] = e->destinataire; buf_v[buf_n++] = "\ndata\nsubject: "; buf_v[buf_n++] = e->sujet; buf_v[buf_n++] = "\n"; buf_v[buf_n++] = e->corps; buf_v[buf_n++] = "\n.\nquit\n"; for (i = 0; i < buf_n ; i++) if (envoyer_buf (soc, buf_v[i], strlen(buf_v[i])) < 0) return -1; 4) Après la plupart des commandes, le serveur répond une ou plusieurs lignes, chacune terminée par un retour chariot \n. Chacune de ces lignes commence par un code à trois chiffres puis un message explicatif (les serveurs HTTP font de même). Le premier chiffre est le plus important : 2 signifie que la demande a été exécutée sans erreur, 3 que la demande est en cours d exécution, 4 indique une erreur temporaire, 5 que la demande n est pas valide et n a pas pu être traitée. Autrement dit, 2 et 3 valent succès, 4 et 5 erreur. Écrire la fonction int tester_erreur_smtp (char *ligne) recevant en paramètre une ligne terminée par un retour chariot. La fonction examine le premier chiffre du code, puis renvoie 0 si le code est un succès, -1 si le code est un échec. Dans ce dernier cas, la fonction affiche un message d erreur avec la ligne incriminée. int tester_erreur_smtp (char *ligne) if (ligne[0] == 2 ligne[0] == 3 ) if (ligne[0] == 4 ligne[0] == 5 ) fprintf (stderr, "ERREUR SMTP: %s\n", ligne); return -1; fprintf (stderr, "AUTRE ERREUR: %s\n", ligne); return -1; Réseau et Communication, UE SIN5U3, Edouard Thiel CC BY-NC http://pageperso.lif.univ-mrs.fr/~edouard.thiel/ens/rezo/ 5

5) Écrire la fonction int lire_reponses_smtp (int soc) recevant en paramètre une socket connectée au serveur SMTP. La fonction lit toutes les réponses du serveur jusqu à la déconnexion, et pour chaque ligne détectée, teste les réponses SMTP. La fonction s interrompt à la première erreur détectée et affiche la ligne déclarant l erreur. La fonction renvoie 0 pour succès, -1 pour erreur. int lire_reponses_smtp (int soc) /* voir TD7 "défragmentation de lignes" */ char buf[4096]; int i, k, pos = 0, buf_size = sizeof(buf); while (1) k = read (soc, buf+pos, buf_size-pos-1); /* Traitement des erreurs : si k <= 0, on n a pas rajouté de caractères dans buf, donc buf[0.. pos-1] ne contient aucun \n */ if (k < 0) perror ("read socket"); return -1; if (k == 0) buf[pos+k] = 0; /* Par sécurité */ /* Recherche des lignes : on sait qu il n y a pas de \n dans buf[0.. pos-1], donc on cherche les \n dans buf[pos.. pos+k-1]. < pas de \n >< partie à analyser > buf : [_ _ \n 0 ] 0 pos i pos+k < supprimé >< conservé > */ for (i = pos ; i < pos+k; i++) if (buf[i] == \n ) buf[i] = 0; /* On traite la ligne */ if (tester_erreur_smtp (buf) < 0) return -1; k = pos+k-(i+1); /* nb de car restant à analyser */ memmove (buf, buf+i+1, k+1); /* copie avec \0 */ pos = 0; i = -1; /* revient au début de buf */ pos += k; /* RQ maintenant pos == strlen(buf) */ if (pos >= buf_size-2) printf ("Dépassement de buf, contenu supprimé\n"); pos = 0; Réseau et Communication, UE SIN5U3, Edouard Thiel CC BY-NC http://pageperso.lif.univ-mrs.fr/~edouard.thiel/ens/rezo/ 6

6) Écrirelafonctionint envoyer_email (char *nom_serveur, int port, char *nom_client, Email *e) recevant en paramètres le nom nom_serveur d un serveur SMTP, le port du service SMTP, le nom nom_client du client et le courrier e. La fonction se connecte au serveur, écrit les commandes SMTP pour envoyer e, puis lit les réponses SMTP et enfin ferme la connexion. À la moindre erreur, la fonction s interrompt et renvoie -1. Elle renvoie 0 si tout s est bien passé. int envoyer_email (char *nom_serveur, int port, char *nom_client, Email *e) int soc; soc = connecter_au_serveur (nom_serveur, port); if (soc < 0) return -1; if (ecrire_commandes_smtp (soc, nom_client, e) < 0) close (soc); return -1; if (lire_reponses_smtp (soc) < 0) close (soc); return -1; close (soc); 7) Écrire le programme principal qui attend en arguments le serveur, le port, le client, l auteur, le destinataire, le sujet et le corps du message. Il envoie le courrier puis affiche un message de succès ou d échec, enfin se termine avec le code de sortie correspondant. int main (int argc, char *argv[]) Email e; int port, k; char *serveur, *client; if (argc!= 8) fprintf (stderr, "USAGE: %s serveur port client auteur dest sujet corps\n", argv[0]); exit (1); serveur = argv[1]; port = atoi (argv[2]); client = argv[3]; e.auteur = argv[4]; e.destinataire = argv[5]; e.sujet = argv[6]; e.corps = argv[7]; k = envoyer_email (serveur, port, client, &e); printf ("%s\n", k == 0? "SUCCES" : "ECHEC"); exit (k == 0? 0 : 1); Réseau et Communication, UE SIN5U3, Edouard Thiel CC BY-NC http://pageperso.lif.univ-mrs.fr/~edouard.thiel/ens/rezo/ 7