Serveur echo udp pour linux avec un fork

Soyez le premier à donner votre avis sur cette source.

Vue 10 510 fois - Téléchargée 696 fois

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

Ajouter un commentaire Commentaire
fgazier Messages postés 7 Date d'inscription samedi 15 novembre 2003 Statut Membre Dernière intervention 14 avril 2009
15 nov. 2003 à 21:52
Salut
De deux chose : l'une est que j'aimerais voir le contenu de library.h, l'autre et que j'aimerais que tu reface la meme chose en utilisant des taches plutot que des processus.

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.