Vous êtes sur la page 1sur 12
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