begin process at 2012 05 27 19:13:22
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Réseaux & Internet

 > SERVEUR ECHO UDP POUR LINUX AVEC UN FORK

SERVEUR ECHO UDP POUR LINUX AVEC UN FORK


 Information sur la source

Note :
Aucune note
Catégorie :Réseaux & Internet Niveau :Débutant Date de création :25/10/2003 Vu / téléchargé :8 195 / 607

Auteur : stb2680

Ecrire un message privé
Commentaire sur cette source (1)
Ajouter un commentaire et/ou une note

 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

  • /********************************************/
  • /* 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;
  • }
/********************************************/
/*			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.

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources du même auteur

Source avec Zip CLIENT ECHO UDP SOUS LINUX
Source avec Zip SERVEUR ECHO UDP POUR LINUX

 Sources de la même categorie

Source avec Zip Source avec une capture MINI SERVEUR HTTP [WINDOWS] par ganjarasta
Source avec Zip Source avec une capture CLIENT DE TEST MODBUS TCP par brunovan
Source avec Zip Source avec une capture SCANIP [ARP / ICMP] par ganjarasta
Source avec Zip Source avec une capture TRACEROUTE [WINPCAP] par ganjarasta
Source avec Zip SERVEUR MULTITHREAD [LINUX/WIN] par nipepsinicolas

Commentaires et avis

Commentaire de fgazier le 15/11/2003 21:52:37

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.

 Ajouter un commentaire




Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 5,663 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales