Académique Documents
Professionnel Documents
Culture Documents
#include <unistd.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <string.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <netinet/in.h>
#include <netdb.h>
#include <syslog.h>
#include <signal.h>
#include <netinet/in.h>
#include <arpa/inet.h>
void demon () ;
void repeter (int socket_cliente, struct sockaddr_in ) ;
/*void repeter (int socket_cliente) ;*/
int lecture_socket (int socket_cliente, char *buf) ;
/************************************************************************
*
* Fonction principale :
* On cree le demon en dupliquant le processus afin de detacher le
* programme du processus pere
* /*close (0) ;*/
/*close (1) ;*/
/*close (2) ;*/
************************************************************************/
int main ()
{
switch (fork ())
{
case -1 :
perror ("*** erreur : fork impossible : demon non cree") ;
exit (1) ;
case 0 :
/*
* Ce processus fils est celui qui deviendra le demon.
* Ingredients pour en faire un vrai et bon demons :
*/
/* 1 - On cree une nouvelle session. Pas de terminal de controle */
setsid () ;
default :
/* Le processus pere est tue. On rend la main au shell appelant. */
exit (0) ;
}
return 0 ;
}
/************************************************************************
*
* Le programme 'demon'
*
* Structure
* sockaddr_in : /usr/include/netinet/in.h
*
*
*
************************************************************************/
void demon ()
{
int socket_ecoute ;
int socket_cliente ;
int valeur_retour ;
int salong ;
int opt = 1 ;
struct sockaddr_in monadr, sonadr ;
int status ;
/*
* Creation de la socket d'ecoute
*/
socket_ecoute = socket (PF_INET, SOCK_STREAM, 0) ;
/*
* Modification des options associees a la socket d'ecoute.
*/
setsockopt (socket_ecoute, SOL_SOCKET, SO_REUSEADDR, (char *) &opt, \
sizeof (opt)) ;
/*
* Initialisation des parametres internet de la socket d'ecoute.
*/
bzero ((char *) &monadr, sizeof monadr) ;
monadr.sin_family = AF_INET ;
monadr.sin_port = htons (PORT_REPETEUR) ;
monadr.sin_addr.s_addr = INADDR_ANY ;
valeur_retour = bind (socket_ecoute, (struct sockaddr *) &monadr, \
(int) sizeof monadr) ;
/*
* Socket mise en position d'ecoute ('listen'). On specifie aussi le
* nombre de connexions simultanees acceptees.
*/
valeur_retour = listen (socket_ecoute, NB_CONN_MAX) ;
/**
* Le demon tourne indefiniment a l'ecoute d'eventuelles connections
* 'accept'
* Lorsqu'un client se connecte, une socket est cree (socket_cliente).
* on duplique le processus et le processus fils prend en charge
* cette socket par la fonction 'repeter'.
*/
while (1)
{
salong = sizeof sonadr ;
case 0 :
repeter (socket_cliente, sonadr) ;
close (socket_cliente) ;
kill (getpid(),SIGTERM);
default :
waitpid (-1, &status, WNOHANG);
close (socket_cliente) ;
}
}
}
/************************************************************************
*
* La fonction qui repete
*
*
*
************************************************************************/
void repeter (int socket_cliente, struct sockaddr_in sock_addr)
{
int nb_lu ;
char buf [MAXLEN] ;
char * addr;
addr = inet_ntoa(sock_addr.sin_addr);