Programmation reseau.pdf

  • Upload
    issouf

  • View
    38

  • Download
    2

Embed Size (px)

Citation preview

10ROGRAMMATIONRSEAUcours @urec.cnrs.fr 2q 1997 : Bernard Tuy, Jean-Paul Gautier 30LANq Mode client - serveurq Gnralits dur les diffrents modes decommunications Socket Stream RPCq Les Socketssource : Rseaux locaux et Internet (Laurent Toutain)[HERMES] 43OCKETq Mcanisme d'interface de programmation permet aux programmes d'changer des donnes n'implique pas forcment une communication par le rseauq Avec les protocoles UDP et TCP, une connexion est entirementdfinie sur chaque machine par : le type de protocole (UDP ou TCP) ladresse IP le numro de port associ au processus serveur : port local sur lequel les connexions sont attendues client : allocation dynamique par le systme 53OCKET MODECONNECTAPPELSSYTMESsocketSERVEURCLIENTbindlistenacceptreadwriteclosesocketconnectwritereadcloseEtablissement de la connexionEnvoi d'une requteRponseFermetureEtat d'attente de requtesAttente effective (bloquant) 63OCKET MODEDATAGRAMMEAPPELSSYTMESsocketSERVEURCLIENTbindrecvfromsendtoclosesocketsendtorecvfromcloseEnvoi d'une requteRponseFermeture(bind) 73OCKET PRIMITIVES5NIXq Dfinition d'une socket Cration s= socket (domaine, type, protocoIe)q domaine PF_UNIX : locale au systme, nom de fichier dans l'arborescence PF_INET: accs au rseau en utilisant le protocole IP PF_ROUTE: passage de paramtres au noyau (tables de routages, tableARTP)q type SOCK_STREAM : protocoles de type mode connect (TCP) SOCK_DGRAM: protocoles de type mode datagramme (UDP) SOCK_RAW : utilisation directe des protocoles de bas niveau 3 (IP,ICMP)q protocole : identification du protocole utilis. Si 0, le systme dduit ce champ des2 paramtres prcdents. 83OCKET PRIMITIVES5NIX Adressagestruct sockaddr {u_char sa_Ien; /*Iongueur totaIe*/u_char sa_famiIy; /* famiIIe d'adresse */char sa_data [14] ; /* vaIeurs */};q dans le fichier source struct sockaddr {u_int8_t sin_Ien ; /*Iongueur totaIe*/u_int8_t sin_famiIy; /* famiIIe d'adresse */u_int16_t sin_port;struct in_addr sin_addr;int8_t sin_zero[8];};q dans le fichier source netinet/in.h 93OCKET PRIMITIVES5NIX Lien entre la socket et le protocoleerror= bind (s, adr, adrIong)q error : entier qui contient le compte-rendu de linstruction 0: opration correctement droule -1 : une erreur est survenueq sdescripteur de la socketqadr pointeur vers la zone contenentladresse de la stationqadrlong logueur de la zone adr Ouverture dune connexionerror= connect (s, destaddr, adrIong)q mmes paramtres que pour bind, la structure destadr contient l'adressede la machine distante ainsi que le numro de port atteindre 103OCKET PRIMITIVES5NIX Primitives du serveurIisten (s, backIog)q permet de crer une file d'attente pour recevoir les demandes deconnexion qui n'ont pas encore t prises en compte. s descripteur de la socket backlog nombre de requtes maximum autorises.snew = accept (s, cIientaddr, cIientaddrIen)q blocage dans l'attente d'une connexion si accept est OKq les donnes peuvent tre lues ou crites travers la socket snew 113OCKET PRIMITIVES5NIXq Adresses locales et distantes d'une socketgetsockname ( s, localadr, addrlen )q permet de connatre l'adresse locale d'une socket (celle du bind).q utile pour connatre le numro de port attribu dynamiquement par lesystme.getpeername ( s, destadr, addrlen )q permet de connatre l'adresse distante d'une socket (celle du connect)pour les sockets en mode connect. 123OCKET PRIMITIVES5NIXq Rception de donnescc = read (s , buffer, taillemax )q buffer est un pointeur vers la zone de rception.q cc : nombre d'octets rellement reus. cc = recv (s , buffer, taillemax, drapeau )q drapeau permet de configurer la connexion MSG_OOB : lecture "out of band" des messages urgents MSG_PEEK : lecture des donnes sans les retirer du tamponcc = recvfrom (s , buffer, taillemax, drapeau , metteur, adrlg)q metteurcontient l'adresse de l'metteur, utilis en mode datagramme 133OCKET PRIMITIVES5NIXq Emission de donneswrite (s , buffer, longueur )q utilisable uniquement en mode connect (pas d'adresse de destinataire) send (s , buffer, taillemax, drapeau )q drapeau permet de configurer la connexion MSG_OOB : criture"out of band" des messages urgents MSG_DONTROUTE : dboguage .sendto (s , buffer, taillemax, drapeau , rcepteur, adrlg)q rcepteurcontient l'adresse du destinataire, utilis en mode datagramme 143OCKET PRIMITIVES5NIXq Fin d'utilisation d'une socketclose ( s ) 153OCKET PRIMITIVES5NIXqAccs aux bases de donnes relatives aux sitesstruct hostent *gethostbyname ( name )q interrogation sur /etc/hosts, NIS, DNSq la structure est dfinie dans netdb.hstruct hostent *gethostbyaddr ( addr, len, type ) gethostname ( name , namelen)q permet de connatre le nom de la machine locale sur laquelle s'xcute leprogramme.getnetbyname ( name ), getnetbyaddr (netaddr, addrtype)q le rseau sur lequel on travaillegetprotobyname ( name ), getprotobynumber (number)q le protocole utilisgetservbyname ( name , proto), getservbyport ( port, proto)q le service utilis 163OCKET EXEMPLEq Programme permettant de savoir si un utilisateur est connu sur une station.serveurclientrequte commande : client serveur nomsource : Internetworking with TCP/IP (Douglas COMER)service TCP dfini dans /etc/serviceskey 5002/TCPrponse 173OCKETS EXEMPLECLIENT#incIude #incIude #incIude #incIude #incIude #define BUFSIZE 200#define NORMAL 0main (argc,argv)int argc;char **argv;{int s;int Ien;structsockaddr_insa;structhostent*hp;structservent*sp;descripteur de socketstucture adresse Internetstructure service de nomstructure service Internet 183OCKET EXEMPLECLIENTchar *myname;char buf[BUFSIZE];char *host,*user;myname = argv[0];if(argc != 3){fprintf (stderr, "Usage : %sserveur user\n",myname);exit (1);}user = argv[2];host = argv[1];if((hp = gethostbyname(host)) == NULL){fprintf (stderr, "%s: %sserveur inconnu\n",myname,host);exit (1);}pointeur sur le nom du programmepointeurs sur le serveur et lutilisateurtest des argumentsvoir si le serveur existe,structure hp remplie 193OCKET EXEMPLECLIENTbcopy ((char *)hp->h_addr,(char *)&sa.sin_addr,hp->h_Iength);sa.sin_famiIy = hp->h_addrtype;if((sp = getservbyname("key","tcp")) == NULL){fprintf (stderr, "%s: Pas de service QUI sur ce systme \n",myname);exit (1);}sa.sin_port = sp->s_port;if((s = socket (hp->h_addrtype, SOCK_STREAM,0)) < 0 ){perror ("socket");exit (1);}fprintf ( stdout, "Service %d demand %s\n", sa.sin_port,host );fprintf ( stdout, "Type d'adresse %d ; descripteur de socket\n",sa.sin_famiIy,s);copie de l'adresse duserveur et du typed'adresse dans SAvoir si le service estautoris sur le client,rempli la structure SPnumro du servicecration de la socketclient, allocation parle systme 203OCKET EXEMPLECLIENTif ( connect (s,&sa,sizeof(sa)) < 0 ) {perror ("connect");exit (1)}send ( s, user, strIen(user)+1, NORMAL);recv ( s, buf, BUFSIZE, NORMAL );fprintf ( stdout, "Rponse : %s _n", buf);cIose ( s );exit (0);}connexion au serveur, infos dans lastructure adresse Internetenvoi de la requtelecture de la rponsecriture de la rponsefermeture de la connexion 213OCKETS EXEMPLESERVEUR#incIude #incIude #incIude #incIude #incIude #incIude #define BUFSIZE 200#define NORMAL 0#defineBACKLOG1#define MAXHOSTNAME32#define MAXREQ 3main (argc,argv)int argc;char **argv;void quiest();taille de la file d'attente initialise par listennombre de requtes traites par ce programme, ils'arrte ds que la limite est atteinte 223OCKET EXEMPLESERVEURint s, t;int i,count_req;structsockaddr_insa;structsockaddr_inisa;structhostent*hp;structservent*sp;char IocaIhost[MAXHOSTNAME+1];if((sp = getservbyname("key","tcp")) == NULL){fprintf (stderr, "Pas de service QUI sur ce systme \n");exit (1);}sa.sin_port = sp->s_port;descripteur de socketstucture adresse Internetstructure service de nomstructure service Internetvoir si service existercupration du numro deport serveur dans lastructure SA 233OCKET EXEMPLESERVEURgethostname (IocaIhost, MAXHOSTNAME);hp = gethostbyname (IocaIhost);bcopy(hp->h_addr,(char *)&sa.sin_addr,hp->h_Iength);sa.sin_famiIy = hp->h_addrtype;if((s = socket (hp->h_addrtype, SOCK_STREAM,0)) < 0 ){perror ("Serveur : probIme cration socket");exit (1);}if ( bind ( s, &sa, sizeof(sa)) < 0 ) {fprintf (stderr, "Serveur : probIme cration Iien");exit (1);}Iisten (s, BACKLOG);fprintf ( stdout, "Service %d sur %s en attente\n",sa.sin_port,IocaIhost);fprintf (stdout, " type d'adresse : %d _n",sa.sin_famiIy);infos sur le serveur dans lastructure HPrempli la structure adresse SAallocation d'un descripteur desocketlien socket avec adresse IP etportattente de demande deconnexion 243OCKET EXEMPLESERVEURfor (count_req = 0; count_req pw_gecos);send (sock, buf, strIen (buf), NORMAL);}procdure de traitement de la requterception de la demanderecherche dans le fichier /etc/passwdrponseenvoie de la rponse