server.c 2.44 KB
#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <netinet/in.h>
#include <sys/un.h>
#include <netdb.h>
#include <netinet/tcp.h>
#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;
}