0% ont trouvé ce document utile (0 vote)
162 vues12 pages

Programmation Réseau

programmation Reseau (sockets ) client-server

Transféré par

hamza jmili
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
162 vues12 pages

Programmation Réseau

programmation Reseau (sockets ) client-server

Transféré par

hamza jmili
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF ou lisez en ligne sur Scribd
Options » Il faut spécifier son type d’adressage > Les deux types d’adressage les plus répandus : * AF_UNZIX : famille d’adresse UNIX (locale : pas de réseau) * AF_INET : famille dadresse Internet (format %x.20.10.20), » Il faut spécifier un numéro de port sur la machine * Ce numéro doit étre compris entre 49152 et 65535 » II faut spécifier son type = les deux types les plus répandus sont > SOCK_STREAM : spécifiques au mode connecté (TCP) > SOCK_DGRAN : spécifiques au mode non-connecté (UDP) Domaine d’un socket » Domaine internet : AF_INET struct sockaddr_in { short sin fami, [* AEINET aT shot sin_port Js ruméro de port *] struct sh_adar, jr adresse interet*/ char sin_zer0(8); 7° champ de 8 zeres) */ % > Domaine UNIX : AF_UNIX Les sockets sont locales au systime et fournissent un mécanisme 41PC CinterProcessus Communication) struct sockaddr_un short sun_famly; JRAEUNK +f char suncpath [108] /* référence UNIX */ Options > De la méme fagon qu’on attribue un numéro de téléphone a une personne pour recevoir des appels, il faut spécifier au socket une adresse a laquelle il doit recevoir les messages qui lui sont destinés (bina) » Les sockets de type socx_STREAM ont la possibilité de mettre les requétes de Communication dans une file d’attente (1isten) Attente les demandes > Une fois créé, le socket va attendre les demandes de communication (accept) » Apres la prise en compte de cette demande, le socket peut se remettre a attendre les demandes de communication > Utilisation de Thread ou de fork () [om Connexion entre 2 sockets » Une fois créé le socket qui recoit des demandes de communication, peut étre appelé par un autre socket » Il faut connecter un socket a un autre socket qui est en attente (connect) » Une fois la connexion établie, la conversation peut commencer (read, wri te...) » Ala fin de la communication (comme on raccroche le téléphone) il faut fermer le socket qui a servi & la communication (close) Les primitives dinitialisation et de mise en relation Initialisation > Initialisation obligatoire avant utilisation des sockets [WSADATA WSAData; WSAStart up (MAKEWORD (2,0), &WSAData) /[faire wSACleanup (); alafin de utilisation des sockets Création du socket KET sock; //Initiallser une varlable de type socket "KADDR_IW sing /finformations techniques du socket [si serveur : ein. sin_addr.s_addr = htond (INADDR_ANY) ; //si client Nein. sin_addr.s_addr = inet_addr (*10.7.9.1") ; /fadresse serveur sin. sin family = AF_INeT; //famille du socket sin.sin port = htons (4148) ; //port sur lequel se connecter ou écouter A ports ré | sock = socket (AFINET, SOCKSTREAM, IPPROTO_TCP) ; //eréation du | socket TCP/IP Her paramétre ; famille du socket 1/2iéme paramétre : type de socket 1/3" parameétre : protocole IP Relier le socket a l’adresse et au port bind(sock, (SOCKADDR *) &sin, sizeof (sin)); » Attache le socket directement au port et a l'adresse définis dans sin »Trois parametres * sock : le socket initialisé « &sin: adresse de structure SOCKADDR_IN " sizeof (sin) : la taille de l’adresse Ecouter le port (serveur) | int val = listen(sock, 0); [ine vat = Listen sock, 07 | » écouter le port sur le socket : * ler argument, sock : socket sur lequel le listen () écoutera = 2nd argument, le BACKLOG : nombre maximum de connections qui seront écoutéés en meme temps * retour 0, ou SocKET_ERROR en cas de probléme > généralement utilisé aprés les appels socket et bind et Juste avant accept > Ne siutilise quien mode connecté > Largument backlog spécifie le nombre de connections établir dans une file d’attente par le systéme lorsque le serveur exécute l'appel accept Accepter une connexion (serveur) SOCKADDR_IN csins int val; val = accept (sock, (SOCKADDR *)&csin, sizeof (csin)) » permet d'accepter une connection = ler argument: le socket (qui est en écoute...) = 2éme argument : socKADDR du client connecté = 3eme argument : la taille de I’adresse du client retourne un identificateur du socket de réponse, ou INVALID_SOCKET en cas d’erreur Demander une connexion (client) int - ; | = connect (sock, (SOCKADDR *)éssin, sizeof (sain) » permet d'établir une connexion avec un serveur * Ler argument : le socket = 2eme argument : adresse de I'héte a contacter = 3éme argument : taille de l'adresse de I'héte = retourne 0 si la connexion a eu lieu, sinon -1 » Pour établir une connexion, le client ne nécessite Pas de faire un bind() Les primitives d’échanges d'information Emission d'information » Une fois que le programme d’application dispose d’un socket, il peut l’utiliser afin de transférer des données » 5 primitives utilisables : send * sendto * sendmsg * write writev Mode connecté > send, write et writev ne permettent pas d'indiquer d’adresse de destination (int socktd, char *buff, int nbytes ) z v (nt sock£d, iovee *vect_£/S, int 1grvect_£/S ) 7 d (int sockfd, char *buff, int nbytes, int > socked : descripteur de socket > bu£e : polnteur sur un tampon ol sont stockées les données & Avoyer > nbytes : nombre doctets ou de caractéres que Ion désire envoyer > vect_&/s : pointeur vers un tableau de pointeurs sur des blocs qul constituent ie message & envayer flags : drapeau de contréle de la transmission ’ v Mode non-connecté 1 sendto € sendnag imposent dindiquerfadresse de destination ine aendto (int aocktG, char “buff, Ant nbytes, int flags, 1 struct sockaddr “te, ine addelen) 7 5a premiers arguments wemes que pour send > 2 derners arguments : adresse de destination ets tlle Réception d'information »S primitives de réception d‘information symetriques aux appels d’envoi : ® read * readv * recv * recvfrom = recvmsg 9 Mode connecté int read ( int sockfd, char *buft, int nbytes ) int recv (int sockfd, char “buff, int nbytes, int flags ) ; > sockfd : descripteur du socket sur lequel les données seront lues » buf£ : pointeur sur un buffer ol seront stockées les données lues > nbytes : nombre maximal d’octets ou de caractéres qui seront lus » flags : drapeau de contréle de la transmission int readv ( int sockfd, iovec *vect_£/S, int igr_vect_8/S ) ; > reagy permet de mettre les données iues dans des cases mémole non contigués » Ces cases mémoires sont pointées par un tableau de pointeurs qui lui méme est pointe par vece./S >» iIgr_vect_£/S est la longueur de ce tableau » Mode non-connecté » il faut préciser les adresses des correspondants desquels on attend des données int recvirom (int sockfd, char *buff, int nbytes, 7 int flags, struct sockaddr *from, int addrlen) + >» Symétrique de sendto int recvmsg (int sockfd, struct struct_mesg, int flags); > Symétrique de sendmsg > utilise la méme structure st ruct_mesg sme: eurtor tee 2 Les ports réservés Unix » echo 7 (top) >» echo 7 (udp) > systat 11 (ep users) > daytime 13 (tep) > daytime 13 (udp) > netstat 15 (top) > fip-data 20 (tep) > 21 (tep) > telnet 23 (tep) > smtp 25 (tep mall) > time 37 (tep timserver) » time 37 (udp timserver) >» name 42 (udp nameserver) > whois 43 (tep nicname) >» domain 53 (udp) » domain 53 (tep) » cP hostnames 101 (tcp hostname) es: muATTOY eee SERVEUR EN HODE coNNECTE ‘SERVEUR EN MODE DECONNECTE SOCKETO (CLIENT EN MODE DECONNECTE SOCKETO RECVFROMO logue ea mend des doundes dn client ‘SENDTOO Exemple : serveur « Bienvenu sur mon serveur | » Fichiers d’en-téte et bibliotheques > Windows : #include #include "winsock2.h" Unix : #include #include #include ewartor Serveur sinclude include ‘void main() char buter(255): SOCKET sock, csock; SOCKADDR_IN sin, csin; Sock = socket(AF_INET, SOCK_STREAM, 0); Sin sin_addrs_addr = INADDR_ANY; INET, ssinsin_farily “INET, sinst_port tons 4444); inal sack, (SOCKADDR *J&sin, sizeortsin)): fsten(sock, 0); while(1) ¢ int sinsize = stzeof{csin); vuvvvevervvevereyy fesock = accept(sock, (SOCKADDR *)8csin, Ssinsize)) != sata soci 2} stees avery Client sinctuae Finclade Finctuge ewinsoa2 n> oe . ‘SOCKET sock: . 'SOCKADOR IW sin; . ‘char ourer[255); f Sock = Socket{AP INET, SOCK STREAM, 0; > Sinsin adds addr = inet addr("127.0.0.0": > sinsin family AEINET: ¢ ssn.sin_port = Aeans(a444); cannect(sock, (SOCKADOR *)8sin, sizeof(sn) ‘getcn): lasesacket(sock); Wsacteanupd); Différents types de serveurs + Tant quil n'y a pas de connexions le serveur se bloque sur cette appel » Lorsqu’une demande se termine » Le serveur peut gérer les demi » Itérativement de connexion arrive, 'appel accept andes de 2 maniéres : = Simultanément amerror te 28

Vous aimerez peut-être aussi