Sunteți pe pagina 1din 15

MART1 2011/2012

Universit Gaston Berger UFR SAT_ CFPP

(Project_Socket)

MAR&T1

1 Le concept de socket :
1.1 Quest-ce quun socket ? < Dfinition dun socket > Les accs rseau dUNIX utilisent un concept baptis tube nomm ou socket. Les sockets constituent une gnralisation du mcanisme UNIX daccs aux fichiers. Ils permettent de dfinir une extrmit de connexion. Mcanisme offerts par UNIX pour tablir des communications entre processus sur une mme machine ou sur des machines diffrentes. Cest un objet systme auquel un processus peut se connecter (se raccorder ou se rattacher) pour envoyer ou recevoir des donnes. Un seul processus est la fois propritaire dun socket (un numro de tlphone est attribu un seul abonn). Un socket est identifie dans un processus par un descripteur (de type int) de la mme manire quun chemin dE/S. Le processus peut donc lire et crire en utilisant les primitives standards (read, write) et donner en hritage le chemin daccs au socket un processus fils. Les sockets sont des mcanismes dinterface de programmation qui permettent aux programmes dchanger des donnes. Les sockets sont la frontire entre lespace de lutilisateur et lespace noyau dUNIX. Les sockets nimpliquent pas forcment une communication via le rseau. Ainsi les sockets du domaine UNIX permettent 2 programmes situs sur la m me machine dchanger des donnes en faisant rfrence un nom de fichier. 1.2 Diffrentes phases de dialogue : En gnral, la structure de deux processus UNIX communiquent par un des mcanismes de communication offert par ce systme obit au schma ci-dessous et se compose de trois phases : a) phase dinitialisation, b) phase dialogue, c) phase terminaison

Les sockets permettent dtablir des communications intra-machine et inter machines Unix. 1.3 Conditions dune connexion Avec les protocoles UDP & TCP, une connexion est entirement dfinie par les paramtres : le type de protocole au niveau de la couche transport : TCP ou UDP, ladresse IP de la machine source, le numro du port associ au processus sexcutant sur la machine source, ladresse IP de la machine destinatrice, le numro du port associ au processus sexcutant sur la machine cible. Le type du protocole tant commun aux 2 applications, cela se traduit localement sur chaque machine, par 3 valeurs : type du protocole (UDP ou TCP), adresse IP, numro du port associ au processus.

Programmation systme

Tah Ould MOHAMED BABA

Universit Gaston Berger UFR SAT_ CFPP

(Project_Socket)

MAR&T1

Ces 3 informations doivent tre fournies au systme lors de la cration d un socket. La connexion, du moins dans sa phase dtablissement, nest pas symtrique. On appelle : serveur, une application qui attend les demandes douverture de connexion, client, une application qui effectue ces demandes douverture. Sur le serveur devront tre dfinis : le protocole utilis numro du port local sur lequel les connexions devront tre attendues. Pour le client, devront tre dfinis, le protocole, ladresse de la machine distante et le numro de port sur lequel elle attend les connexions. 2. Communication intra-machine et inter-machine

3. Caractristiques dun socket La cration dun socket se fait grce lappel de la fonction socket. a) Cration La cration dun socket seffectue grce lappel systme de la fonction socket Prototype : int socket (int domain, int type, int protocol) ; Cette fonction renvoie un identificateur sur la socket cre. Cet entier est un index dans la table des descripteurs des fichiers du processus. Il sagit donc dune ressource qui est de mme genre que ce qui est allou par la fonction open. Lappel systme iSockfd = socket (domaine, type, protocole) ; c re un socket identifi par lentier iSockfd. iSockfd = socket (int family, int type, int protocole) ; b) Le Domaine dun socket : domain ou family Famille ou domaine de protocole, permet dinterprter ladresse fournie. Les diffrents domaines sont :

Programmation systme

Tah Ould MOHAMED BABA

Universit Gaston Berger UFR SAT_ CFPP c) les types disponibles : type de communication

(Project_Socket)

MAR&T1

d) les protocoles : permettent de selectionner un protocole particulier

Les constantes IPPROTO_XXX sont dfinies dans le fichier include <netinet/in.h> Fermeture dun socket Aprs utilisation il faut fermer le socket prcdemment cre par : close (sockfd). On peut aussi utiliser l'appel shutdown() pour une gestion plus fine : Prototype : int shutdown (int sockfd, int iNb) ; iNb peut prendre les valeurs suivantes : 0 1 2 la socket ne peut plus recevoir de donnes, la socket ne peut plus envoyer de donnes (socket passive,coute seulement), fin de la communication (dans les deux sens).

4. Adresse de socket selon le domaine : 4.1 Familles dadresses Il existe plusieurs familles dadresses, chacune correspondant un protocole particulier. Les familles les plus rpandues sont : AF_UNIX protocoles internes dUNIX, AF_INET protocoles Internet, 4.2 Le systme dadressage Les structures dadresses a) Ladressage dpend du protocole : Unix : un nom de fichier ; IPv6 : adresse IPv6 et un numro de port, marque et champ dutilisation ; X25 : adresse X 121. b) Une structure dadresse gnrique La structure gnrique pour les adresses (extrait du fichier /usr/include/sys/socket.h) : struct in_addr { u_long s_addr; };

Programmation systme

Tah Ould MOHAMED BABA

Universit Gaston Berger UFR SAT_ CFPP

(Project_Socket)

MAR&T1

Plusieurs appels systmes rseaux sous UNIX ncessitent un pointeur sur une structure dadresse de socket. La dfinition de cette structure se trouve dans : struct sockaddr { u_short sa_family; /* address family * / char sa_data[14]; /* up to 14 bytes of direct address */ }; sa_family : adresse de famille, prend la valeur AF_XXX, sa_data : peut contenir jusqu 14 octets de protocole spcifique dadresse. a) Une structure compatible par famille Domaine AF_UNIX (socket locale) La structure spcifique au domaine AF_UNIX (extrait du fichier /usr/include/sys/un.h) : struct sockaddr_un { short sun_family; /* AF_UNIX */ char sun_path[108]; /* path name */ }; Domaine AF_INET (Communication Internet) La structure spcifique au domaine AF_INET (extrait du fichier /usr/include/netinet/in.h) : struct sockaddr_in { short sin_family ; /* famille de ladresse AF_INET */ u_short sin_port ; /* numro de port sur 2 octets */ struct in_addr sin_addr ; /* adresse Internet sur 4 octets */ char sin_zero[8] ; /* champ de remplissage 8 zros */ }; sin_port : 16 bits de numro de port (ordonnancement rseau) sin_addr : 32 bits constituants lidentificateur du rseau et de la machine hte ordonns selon lordre rseau. sin_zero : inutiliss. Domaine AF_INET6 La structure spcifique au domaine AF_INET6 (extrait du fichier netinet/in6.h ) struct in6_addr { union { unsigned char u6_addr8[16]; unsigned short int u6_addr16[8]; unsigned int u6_addr32[4]; } in6_u; #define s6_addr in6_u.u6_addr8 #define s6_addr16 in6_u.u6_addr16 #define s6_addr32 in6_u.u6_addr32}; struct sockaddr_in6 { unsigned short int sin6_family; unsigned short int sin6_port; unsigned int sin6_flowlabel; struct in6_addr sin6_addr; unsigned int sin6_scope_id; }; Pour la famille Internet les structures suivantes sont dfinies dans le fichier : <netinet/in.h> struct in_addr { u_long s_addr ; };

Programmation systme

Tah Ould MOHAMED BABA

Universit Gaston Berger UFR SAT_ CFPP

(Project_Socket)

MAR&T1

s_addr : 32 bits constituants lidentificateur du rseau et de la machine hte, ordonn selon lordre rseau. Pour les adresses TCP/IP, ladresse de socket est dsigne par sockaddr_in Pour que le serveur puisse accepter une connexion provenant dune adresse IP quelconque laide de INADDR_ANY. Exemple dutilisation : adresse_serveur.sin_addr.s_addr = htonl (INADDR_ANY); adresse_serveur.sin_port = htons (10000) ;

5. Les appels systme Diffrentes fonctions existent afin de grer les diffrentes connexions entre serveur et client. 5.1 Librairie dinclusion Les appels systme ci-dessous ncessitent les librairies : #include <sys/types.h> #include <sys/socket.h> 5.2 Attachement dun socket une adresse : bind Une fois, le point de communication cr, il faut lui associer une adresse locale. Le point de communication sera compltement dfini lorsque la socket sera associ une adresse IP et un numro de port. L'attachement d'une adresse un socket se fait grce l'appel de la fonction bind(). int bind (int iSockfd, structaddr *myadr, int iAddrlen) ; Le 1 argument est le descripteur de socket retourn par lappel socket. Le 2 argument est un pointeur sur une adresse de protocole spcifique. Le 3 est la taille de cette structure dadresse. Il y a 3 utilisations possibles de bind : Le serveur enregistre sa propre adresse auprs du systme. Il indique au systme que tout message reu pour cette adresse doit lui tre fourni. Que la liaison soit avec ou sans connexion, lappel de bind est ncessaire avant lacceptation dune requte dun client. Un client peut enregistrer une adresse spcifique pour lui mme. Un client sans connexion doit sassurer que le systme lui a affect une unique adresse que ses correspondants utiliseront afin de lui envoyer des messages. Lappel de bind rempli ladresse locale et celle du processus associ au socket. 5.3 Lappel systme connect Un socket est initialement cre dans ltat non connect, ce qui signifie quil nest associ aucune destination loigne. Lappel systme connect associe de faon permanente un socket une destination loigne et le place dans ltat connect.

Programmation systme

Tah Ould MOHAMED BABA

Universit Gaston Berger UFR SAT_ CFPP

(Project_Socket)

MAR&T1

int connect (int sockfd, struct sockaddr *servaddr, int addrlen) ; sockfd : est le descripteur de socket retourn par lappel socket ; servaddr : est un pointeur sur une structure dadresse de socket qui indique ladresse de destination avec laquelle le socket doit se connecter. addrlen : taille de la structure dadresse. Un programme dapplication doit invoquer connect pour tablir une connexion avant de pouvoir transfrer les donnes via un socket de transfert en mode connect. Les sockets utiliss avec les services de transfert en mode datagramme nont pas besoin dtablir une connexion avant dtre utiliss, mais procder de la sorte interdit de transfrer des donnes sans mentionner chaque fois, ladresse de destination. 5.4 Lappel systme listen int listen (int sockfd, int backlog) ; Cet appel est gnralement utilis aprs les appels socket et bind et juste avant lappel accept. Largument backlog spcifie le nombre de connexions tablir dans une file dattente par le systme lorsque le serveur excute lappel accept. Cet argument est gnralement mis 5 qui est la valeur maximale utilise. 5.5 Lappel systme accept int accept (int iSockfd, struct addr *peer, int *addrlen) ; Largument iSockfd dsigne le descripteur de socket sur lequel seront attendues les connexions. Peer est un pointeur vers une structure dadresse de socket. Lorsquune requte arrive, le systme enregistre ladresse du client dans la structure *peer et la longueur de ladresse dans *addrlen. Il cre alors un nouveau socket connect avec la destination spcifie par le client, et renvoie lappelant un descripteur de socket. Les changes futurs avec ce client se feront donc par lintermdiaire de ce socket. Le socket initial sockfd na donc pas de destination et reste ouvert pour accepter de futures demandes. Tant quil ny a pas de connexion le serveur se bloque sur cet appel. Lorsquune demande de connexion arrive, lappel systme accept se termine. Le serveur peut grer les demandes itrativement ou simultanment. Dans lapproche itrative, le serveur traite lui-mme la requte, ferme le nouveau socket puis invoque de nouveau accept pour obtenir la demande suivante. Dans lapproche parallle, lorsque lappel systme accept se termine, le serveu r cre un serveur fils charg de traiter la demande (appel de fork et exec). Lorsque le fils a terminer il ferme le socket et meurt. Le serveur matre ferme quand lui la copie du nouveau socket aprs avoir excut le fork. Il appelle ensuite de nouveau accept pour obtenir la demande suivante. 6 Echange dinformation 6.1 Emission dinformation Une fois que le programme dapplication dispose dun socket, il peut lutiliser afin de transfrer des donnes. Cinq appels systmes sont utilisables : send, sendto, senmsg, write , writev. Nota : send, write et writev ne sont utilisables quavec des sockets en mode connect car ils ne permettent pas dindiquer dadresse de destination. Les diffrences entre ces 3 appels sont mineures : write (int sockfd, char *buff, int nbytes) ; writev (int sockfd, iovec *vect_E/S, int lgr_vect_E/S) ; int send (int sockfd, char *buff, int nbytes, int flags) ; buff est un pointeur sur un tampon o sont stockes les donnes envoyer, nbytes est le nombre doctets ou de caractres que lon dsire envoyer,

Programmation systme

Tah Ould MOHAMED BABA

Universit Gaston Berger UFR SAT_ CFPP

(Project_Socket)

MAR&T1

vect_E/S est un pointeur vers un tableau de pointeurs sur des blocs qui constituent le message envoyer, flags drapeau de contrle de la transmission. Pour le mode non connect on a 2 appels sendto et sendmsg qui imposent dindiquer ladresse de destination : int sendto (int sockfd, char *buff, int nbytes, int flags, struct sockaddr *to, int addrlen) ; Les 4 premiers arguments sont les mmes que pour send, les 2 derniers sont ladresse de destination et la taille de cette adresse. Pour les cas o on utiliserait frquemment lappel sendto qui ncessite beaucoup darguments et qui serait donc dune utilisation trop lourde on dfinit la structure suivante : struct struct_mesg { int *sockaddr ; int sockaddr_len ; iovec *vecteur_E/S ; int vecteur_E/S_len ; int *droit_dacces ; int droit_dacces_len ; }; Cette structure sera utilise par lappel sendmsg ; int sendmsg (int sockfd, struct struct_mesg, int flags) ; 6.2 Rception dinformations On distingue 5 appels systme de rception qui sont symtriques au appels denvoi. Pour le mode connect on dispose de read, readv, recv et pour le mode sans connexion on peut choisir parmi : recvfrom, recvmsg. int read (int sockfd, char *buff, int nbytes) ; int readv (int sockfd, iovec *vec_E/S, int lgr_vect_E/S) ; int recv (int sockfd, char *buff, int nbytes, int flags) ; buff est un pointeur sur un buffer o seront stocks les donnes lues, nbytes est le nombre maximal doctets ou de caractres qui seront lus. readv permet de mettre les donnes lues dans les cases mmoires non contigus. Ces cases mmoires sont pointes par un tableau de pointeurs qui lui mme est point par vect_E/S. lgr_vect_E/S est la longueur de ce tableau. Pour le mode sans connexion, il faut prciser les adresses des correspondants desquels on attend des donnes. int recvfrom (int sockfd, char *buff, int nbytes, int flags, struct sockaddr *from, int addrlen); int recvmsg (int sockfd, struct struct_mesg, int flags); Arguments flags : Les arguments flags sont soit 0 soit le rsultat dun OR entre les 3 constantes : MSG_OOB mission ou rception de donnes hors bande, MSG_PEEK peek at incoming message (recv OR recvfrom) MSG_DONTROUTE bypass routing (send or sendto) 6.3 Le multiplexage Lappel systme qui permet le multiplexage des sockets est : int select (int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout) ; Cette fonction examine les descripteurs qui lui sont passes en paramtre et teste si certains sont prts lire, crire ou ont une condition dexception. 7 Choix des modes de transmission : TCP ou UDP Stream & Datagramm Avant dinitialiser un socket il faut choisir le type dchange entre client et serveur :

Programmation systme

Tah Ould MOHAMED BABA

Universit Gaston Berger UFR SAT_ CFPP Stream, Datagramme,

(Project_Socket) protocole TCP protocole UDP.

MAR&T1

Quelle diffrence entre les deux ? Le protocole TCP fonctionne en mode connect, cest --dire que la liaison entre client et serveur et correcte, donc scuris (partiellement), Le protocole UDP fonctionne en mode non connect, donc plus rapide lors de lenvoi des donnes mais sans aucune garantie que les donnes arrivent destination. Quels appels systmes mettrent en oeuvre ? a) Mode Stream : TCP

b)Mode Datagramme : UDP

8 Fonctions de conversion Les machines ont des faons diffrentes denregistrer les entiers et les protocoles TCP/IP ont une reprsentation des octets normalises et indpendantes des machines. Pour que les programmes soient portables sur toutes les machines il faut pouvoir convertir les reprsentations rseaux en reprsentation machine de chaque paquet et vice versa. 8.1 Procdures rseau de conversion de lordre des octets htonl (val) host to network long : convertit une valeur sur 32 bits de la reprsentation machine vers la reprsentation rseau. htons (val) host to network short : convertit une valeur sur 16 bits de la reprsentation machine vers la reprsentation rseau.

Programmation systme

Tah Ould MOHAMED BABA

Universit Gaston Berger UFR SAT_ CFPP

(Project_Socket)

MAR&T1

ntohl (val) network to host long : convertit une valeur sur 32 bits de la reprsentation rseau vers la reprsentation machine. ntohs (val) network to host short : convertit une valeur sur 16 bits de la reprsentation rseau vers la reprsentation machine. 8.2 Les oprations sur les octets Pour initialiser une structure ou pour mettre jour on dispose de 2 fonctions : a) La fonction bzero () qui initialise 0 tous les champs de la structure passe en paramtre. Cette fonction doit tre appele avant lutilisation de la structure. b) La fonction bcopy () qui a pour paramtre 2 structures et un entier n qui indique le nombre doctets copier. Cette fonction copie les n premiers octets de la structure 1 dans la structure 2. 9 Les noms de machine Le systme UNIX gre en interne un nom de machine. Pour les machin es relies lInternet, le nom interne concide gnralement avec celui du domaine qui correspond avec linterface rseau principale. Lappel systme rechercher le nom de la machine (ge thostname) permet aux processus utilisateurs daccder au nom de la machine. Lappel systme dfinir le nom de la machine sethostname) permet des processus privilgis de dfinir le nom de la machine. Ces appels ont la forme suivante : gethostname (nom, longueur) ; sethostname (nom, longueur) ; nom est un pointeur sur une chane de caractres contenant le nom de la machine ; longueur est la taille du nom. 10 Gestion des adresses IP Les adresses IP et comment les utiliser Il y a plein de fonctions qui permettent de manipuler les adresses IP. Par exemple si nous avons une structure struct sockaddr_in et une adresse IP "127.0.0.1" que nous voulons y placer. La fonction que nous devons utiliser est inet_addr(), qui convertit une adresse IP en notation dcimale pointe en un entier long non sign. L'assignation peut tre faite de la manire suivante : ina.sin_addr.s_addr = inet_addr("127.0.0.1"); On note que inet_addr() retourne dj l'adresse en "Network Byte Order" On sait maintenant convertir les chanes d'adresses IP en longs. Comment le faire dans l'autre sens? Que faire si l'on a une struct in_addr et que l'on veut l'imprimer sous la forme chiffres et points? Dans ce cas, il faut utiliser la fonction inet_ntoa() ("ntoa" signifie "network vers ascii") comme ceci : printf("%s",inet_ntoa(ina.sin_addr)); Ceci imprimera l'adresse IP. Notons qu inet_ntoa() prend une struct in_addr comme argument, et non un long. Remarquons aussi qu'elle retourne un pointeur vers un char. Il pointe vers un tableau statique de char dans inet_ntoa() de telle sorte que chaque appel vers inet_ntoa() crasera la dernire adresse IP demande. Par exemple : char *a1, *a2; a1 = inet_ntoa(ina1.sin_addr); /* soit 192.168.0.2 */ a2 = inet_ntoa(ina2.sin_addr); /* soit 192.168.0.3 */ printf("client 1: %s\n",a1); printf("client 2: %s\n",a2); Rsultat du print : client1: 192.168.0.2 client 2: 192.168.0.3

11.Capture du projet
Dans cette partie nous prsentons des testes afin de montrer le fonctionnement de la configuration et les structures des codes client/ serveur du projet . Programmation systme Tah Ould MOHAMED BABA

Universit Gaston Berger UFR SAT_ CFPP

(Project_Socket)

MAR&T1

Limage suivante teste la connectivit de nos sockets (client-serveur) dans la machine vbox

Ici on a choisi un serveur et deux clients et on voit que le serveur affiche les messages changs par les deux clients et affiche leurs adresses. Les commandes excutes pour crer lexcutable client et serveur

Pour ce qui concern le programme client .c, son code est constitu comme le suivant :
#include<stdlib.h> #include<netinet/in.h> #include<string.h> #include<unistd.h> #include<sys/types.h> #include<sys/socket.h> #include<stdio.h> /* programme client */ int main(int argc, char **argv) { int sockfd; struct sockaddr_in serv ; fd_set rfds; char buf[256]; /*buffer de lecture des infos */ char buf2[256];

Programmation systme

Tah Ould MOHAMED BABA

Universit Gaston Berger UFR SAT_ CFPP

(Project_Socket)

MAR&T1

serv.sin_family = AF_INET; /*On spcifie le domaine dadressage */ serv.sin_port = htons(10000); /*On spcifie le port */ serv.sin_addr.s_addr = inet_addr("127.0.0.1"); /*On dclare l'@ IP */ memset(buf,'\0',256); memset(buf2,'\0',256); /* verification du nombre d'arguments de la ligne de commande */ if(argc != 3) { printf("Usage: %s @serveur port\n", argv[0]); exit(-1); } /* creer maintenant un socket */ sockfd = socket(AF_INET,SOCK_STREAM,0 ); serv.sin_port = htons(10000); /* etablir la connexion avec le serveur */ if(connect(sockfd,(struct sockaddr*)&serv,sizeof(serv)) == -1) { perror("Erreur de connexion -> "); exit(2); } printf("Connexion etablie\n"); while(1) { memset(buf,'\0',256); memset(buf2,'\0',256); FD_ZERO(&rfds); FD_SET(0,&rfds); FD_SET(sockfd,&rfds); if(select(sockfd+1,&rfds,NULL,NULL,NULL) == -1) { perror("Erreur select "); exit(1); } if(FD_ISSET(0,&rfds)) { if(read(0,buf2,256) == -1) { perror("Erreur read "); exit(1); } /* on va envoyer la requete */ if(send(sockfd,buf2,256,0) == -1) { perror("Erreur send "); exit(1); } } if(FD_ISSET(sockfd,&rfds)) { /* lecture de la reponse du serveur */ if(recv(sockfd,&buf,256,0) == -1) { perror("Erreur reception "); exit(4); } printf("Le client %s \n ", buf); /* on ferme le socket */ } } }

Programmation systme

Tah Ould MOHAMED BABA

Universit Gaston Berger UFR SAT_ CFPP

(Project_Socket)

MAR&T1

Et pour notre serveur.c, nous avons le code suivant :


#include<netinet/in.h> #include<arpa/inet.h> #include<string.h> #include<unistd.h> #include<sys/types.h> #include<sys/socket.h> #include<stdio.h> #include<stdlib.h> /* programme serveur */ int main(int argc, char **argv) { int sockfd1, sockfd12; fd_set rfds; int t[FD_SETSIZE]; int taille=0; char buf[256]; memset(buf,'\0',256); struct sockaddr_in s_addr; /* struc adresse internet */ struct sockaddr_in cli_addr; socklen_t sin_size = sizeof(struct sockaddr_in); if(argc != 2) { printf("Usage: %s port\n", argv[0]); exit(-1); } /* creer maintenant un socket */ sockfd1 = socket(AF_INET,SOCK_STREAM, 0); /*On dfinit le domaine d'adressage */ s_addr.sin_family = AF_INET; /* recupere le numero du port */ s_addr.sin_port = ntohs(atoi(argv[1])); /*l'adresse IP */ s_addr.sin_addr.s_addr=htonl(INADDR_ANY); /************Gestion des connexions*************/

Programmation systme

Tah Ould MOHAMED BABA

Universit Gaston Berger UFR SAT_ CFPP


/* on va fair un bind sur le socket */

(Project_Socket)

MAR&T1

if(bind(sockfd1,(struct sockaddr*)&s_addr,sizeof(s_addr)) != 0) { perror("Erreur bind -> "); exit(1); } /*initialiser la queue d'ecoute */ if(listen(sockfd1,7) != 0) { perror("Erreur listen -> "); exit(2); } printf("Attendez la connexion\n"); t[0]=sockfd1; taille++; while(1) { FD_ZERO(&rfds); FD_SET(sockfd1, &rfds); int j; int s_max=0;

for(j=0;j<taille;j++){ if(t[j] != 0) {

FD_SET(t[j],&rfds); } if(s_max < t[j]) { s_max = t[j]; } } if(select(s_max+1,&rfds,NULL,NULL,NULL) == -1) { perror("Erreur select -> "); exit(1); } if(FD_ISSET(sockfd1,&rfds)) { /* boucle d'accept */

Programmation systme

Tah Ould MOHAMED BABA

Universit Gaston Berger UFR SAT_ CFPP

(Project_Socket)

MAR&T1

if((sockfd12 = accept(sockfd1,(struct sockaddr*)&cli_addr,&sin_size)) == -1) { perror("Erreur accept -> "); exit(3); } printf("Connexion reussi avec %s \n", inet_ntoa(cli_addr.sin_addr)); taille++; t[taille-1]=sockfd12; } int i; for(i=1;i<taille;i++) if(FD_ISSET(t[i],&rfds)) if(recv(t[i],&buf,256,0) == -1) { { {

perror("Erreur reception -> "); exit(4); int a =1; printf("Le client %d 192.168.0.%d -> %s \n",a=t[i]-2 ,a=t[i]-1 ,buf); int l; for(l=1;l<taille;l++) if(l != i) { { { }

if(send(t[l],buf,256,0) == -1)

perror("Erreur lors de l'appel a send -> "); exit(1); } } } memset(buf,'\0',256); } } } } /******************FIN******************tahgary2@gmail.com****************/

Programmation systme

Tah Ould MOHAMED BABA

S-ar putea să vă placă și