#define _GNU_SOURCE #include #include #include #include #include #include #include #include #include #include #include "server.h" #include #define MAX_LIGNE 512 int initialisationServeur(char *service,int connexions){ struct addrinfo precisions; struct addrinfo *resultat; struct addrinfo *origine; int statut; int s; /* Construction de la structure adresse */ memset(&precisions,0,sizeof precisions); precisions.ai_family=AF_UNSPEC; precisions.ai_socktype=SOCK_STREAM; precisions.ai_flags=AI_PASSIVE; statut=getaddrinfo(NULL,service,&precisions,&origine); if(statut<0){ perror("initialisationServeur.getaddrinfo"); exit(EXIT_FAILURE); } struct addrinfo *p; for(p=origine,resultat=origine;p!=NULL;p=p->ai_next) if(p->ai_family==AF_INET6){ resultat=p; break; } /* Creation d'une socket */ s=socket(resultat->ai_family,resultat->ai_socktype,resultat->ai_protocol); if(s<0){ perror("initialisationServeur.socket"); exit(EXIT_FAILURE); } /* Options utiles */ int vrai=1; if(setsockopt(s,SOL_SOCKET,SO_REUSEADDR,&vrai,sizeof(vrai))<0){ perror("initialisationServeur.setsockopt (REUSEADDR)"); exit(EXIT_FAILURE); } if(setsockopt(s,IPPROTO_TCP,TCP_NODELAY,&vrai,sizeof(vrai))<0){ perror("initialisationServeur.setsockopt (NODELAY)"); exit(EXIT_FAILURE); } /* Specification de l'adresse de la socket */ statut=bind(s,resultat->ai_addr,resultat->ai_addrlen); if(statut<0) return -1; /* Liberation de la structure d'informations */ freeaddrinfo(origine); /* Taille de la queue d'attente */ statut=listen(s,connexions); if(statut<0) return -1; return s; } int boucleServeur(int ecoute,int (*traitement)(int)) { int dialogue; while(1){ /* Attente d'une connexion */ if((dialogue=accept(ecoute,NULL,NULL))<0) return -1; /* Passage de la socket de dialogue a la fonction de traitement */ if(traitement(dialogue)<0){ shutdown(ecoute,SHUT_RDWR); return 0;} } } int serv_printf(int s){ printf("Hello %i\n", s); return 0; } int serv_gestionClient(int s){ /* Obtient une structure de fichier */ FILE *dialogue=fdopen(s,"a+"); if(dialogue==NULL){ perror("gestionClient.fdopen"); exit(EXIT_FAILURE); } /* Echo */ char ligne[MAX_LIGNE]; while(fgets(ligne,MAX_LIGNE,dialogue)!=NULL){ #ifdef DEBUG printf("> %s", ligne); #endif fprintf(dialogue,"> %s",ligne); } /* Termine la connexion */ fclose(dialogue); return 0; } void removeSocket(struct pollfd descr[], int i, int length){ for (int j=i;j%i$ %s\n", i+1, ligne); //renvoyer à tous les clients for(int j = 0 ; j < LongueurPoll-1 ; j++){ if(j != i) dprintf(descripteurs[j+1].fd, ":%s\n", ligne); } } } } }