#include #include #include #include #include #include #include #include #include #include #include "server.h" #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; } int boucleServeur2(int ecoute) { //initialisation tableau de socket //int dialogue; struct pollfd descripteurs[1024]; descripteurs[0].fd=ecoute; //initialiser POLLIN for (int i=0;i<1024;i++) { descripteurs[i].events=POLLIN; } int LongueurPoll = 1; while(1){ //poll //if (ecoute est active){ /* Attente d'une connexion */ int dialogue=accept(ecoute,NULL,NULL); if(dialogue<0) return -1; //if longueurPoll <1024 //TODO A GERER descripteurs[LongueurPoll].fd = dialogue; LongueurPoll ++; printf("Nouveau LongueurPoll : %i\n", LongueurPoll); /* Passage de la socket de dialogue a la fonction de traitement */ //if(traitement(dialogue)<0){ shutdown(ecoute,SHUT_RDWR); return 0;} //} } }