Académique Documents
Professionnel Documents
Culture Documents
Commentaires :
compiler : make repeteur
exécuter : ./repeteur
liste processus : ps aux
terminal : telnet 127.0.0.1 6666
Code :
/*
* Fichier 'repeteur.c' utilise pour le TD 5 de programmation IP.
* Le programme 'repeteur' est un programme demon "repetant" tout
* ce qu'on lui dit. Il tourne sur le port 6666 et reste à
l'ecoute
* d'une eventuelle connexion.
*
* Historique
* 1999/10/15 : dntt : creation
*/
#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 <arpa/inet.h>
void demon () ;
/
******************************************************************
******
*
* Fonction principale :
* On cree le demon en dupliquant le processus afin de detacher le
* programme du processus pere
*
******************************************************************
******/
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 () ;
/
******************************************************************
******
*
* 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 sonadr)
{
int nb_lu ;
char buf [MAXLEN];