Serveur echo udp pour linux avec un fork

Description

C'est un exemple de serveur echo UDP mais avec un fork. C'est à dire que le serveur fait un fils des qu'un client se connecte à lui. Il peut donc traiter plusieurs demande en meme temps.

Source / Exemple :


/********************************************/
/*			Serveur avec fork en UDP		*/
/* auteur: STB2680							*/
/* date: 13/10/2003							*/
/* objet: creation d'un serveur qui fait des*/
/*	fils pour l'aider a repondre au nombre	*/
/*	de demande des clients. Ils recoivent 1	*/
/*	message et le renvoie aux clients.		*/
/********************************************/
#include "library.h"

int main (int argc, char **argv)
{
	struct sockaddr_in server,client;
	char buf[MAXBUF];
	int buf_len, sk,n_sent,n_read,i,client_ln,pid;

	if (argc != 1) {
		printf("Usage: %s \n",argv[0]);
		exit(0);
	}

/* creation d'un socket

  • IP protocol family(PF_INET)
  • UDP (SOCK_DGRAM)
  • /
if( (sk=socket(PF_INET,SOCK_DGRAM,0)) < 0 ) { printf("Erreur de creation de socket !!!\n"); exit(1); } server.sin_family = AF_INET; /* protocole utilise */ server.sin_addr.s_addr = INADDR_ANY; /*NOADDRY ANY-->@ du serveur c'est notre machine et non plus 1 @ IP */ server.sin_port = htons(PORT); /* etabli le numero du port du serveur */ /* attribution de l'adresse du serveur au socket */ if ( (i = bind(sk,(struct sockaddr *)&server, sizeof(server))) < 0 ) { perror ("Erreur de bind sur le socket"); exit(3); } /* boucle infini ;-) */ while(1) { for (i=0;i<MAXBUF;i++) buf[i] = '\0'; /* on attend une demande d'un client */ client_ln = sizeof(client); printf("Le serveur attend une demande ...\n"); n_read = recvfrom(sk,buf,MAXBUF,0,(struct sockaddr *)&client,&client_ln); // creation du fils qui va gerer la requete if ((pid=fork()) == -1) { perror("Erreur de creation de fils"); exit(1); } // on est dans le fils if (pid == 0) { printf("\ncreation du fils ...\n"); if(n_read < 0) { perror("Probleme de reception"); exit(4); } printf("Le serveur a recu %d bytes: %s \n",n_read,buf); // temporisation pour mieux voir que lorsqu'un serveur est occupe, on utilise un autre sleep(5); /* maintenant, on envoie au client un packet contenant le messsage */ n_sent = sendto(sk,buf,sizeof(buf),0,(struct sockaddr *)&client,sizeof(client)); if(n_sent < 0) { perror("Probleme d'envoie de données"); exit(5); } // mort du fils pour pas qui reboucle du while(1) !!! return 0; } printf("Le pere va se remettre en attente\n"); // sinon on est dans le pere est on attend une nouvelle requete. } return 0; }

Conclusion :


library.h est fournie dans le zip.

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.