Client/serveur: serveur nombre aleatoire [gcc]

Soyez le premier à donner votre avis sur cette source.

Vue 7 196 fois - Téléchargée 304 fois

Description

Le but est de generer un nombre aleatoire et lorsqu un client le trouve, en generer un nouveau.
Interet du code:
Creer un processus pere et des processus fils cote serveur
communication entre ceux ci
(voir le code du client )

lancer le serveur de la facon suivante
./nomduprog.exe numport
exple:
./server_alea 5555

Comment compiler:
cc -c server_alea.c
cc -c creer_socket.c
cc -o server_alea.exe server_alea.o creer_socket.o

Source / Exemple :


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <time.h>
#include <errno.h>
/*pour la fonction waitpid*/
#include <sys/types.h>
#include <sys/wait.h>
#include "creer_socket.h"

#define TRUE 1
struct sigaction action;
int nb;

void eliminer_zombie(int sig)
{
	int code,status;
	//printf("pid fils %d\n",pidfils);
	while(wait3(&status,WNOHANG,NULL)==0)
	{
		printf("_nstatus %d\n",WEXITSTATUS(status));
		}
	if (WEXITSTATUS(status)==1)
		{
			nb=nombre();
		}
	printf("Terminaison d'un processus de service\n");
	wait(NULL);
}

int nombre()
{
	int nb;
	srand(time(NULL));
	nb=rand()%100;
	printf("Voici le nombre:%d\n",nb);
	return nb;
}

int client_nombre(int socket_service, int n)
{
	int socketclt;
	char status[1024];
	int nbclt;
	int nb,stat;
	nb=n;
	socketclt= socket_service;
	ecrire_socket(socketclt,"ok1\n");
	lire_socket(socketclt,status);
	setsid();
	printf("Fils PID %d \n",getpid());
	if(strncmp(status,"oui",3)==0)
	{
		ecrire_socket(socketclt,"ok2\n");
		lire_socket(socketclt,status);
		nbclt=atoi(status);
		if (nbclt==nb)
		{
			ecrire_socket(socketclt,"ok3\n");
			return 1;
		}
			else
			{
				ecrire_socket(socketclt,"ok4\n");
				return 2;
			}
	}
	else if (strncmp(status,"non",3)==0)
		{
			ecrire_socket(socketclt,"ok5\n");
			return 2;
		}
		else
			{
				ecrire_socket(socketclt,"ok6\n");
				return 2;
			}
}

int main(int argc, char* argv[])
{
	struct sockaddr_in adresse;
	int lg_adresse;
	int port, coderetour; /*valeur retourner par la fonction client nombre*/
	int socket_ecoute,socket_service;
	if (argc!=2)
	{
		fprintf(stderr,"Nombre de parametres incorrect\n");
		exit(2);
	}
	if(fork()!=0)
		exit(0);
	setsid();
	printf("Serveur de PID %d lance\n",getpid());
	action.sa_handler=eliminer_zombie;
	sigaction(SIGCHLD,&action,NULL);
	port=atoi(argv[1]);
	lg_adresse=sizeof(adresse);
	if((socket_ecoute=creer_socket_serveur(port))==-1)
	{	
		fprintf(stderr,"creation socket ecoute impossible\n");
		exit(2);
	}
	nb=nombre();
	while (TRUE)
	{
		socket_service=accept(socket_ecoute,&adresse,&lg_adresse);
		if(socket_service==-1 && errno==EINTR)
			continue;
		if(socket_service==-1 && errno!=EINTR)
		{
			perror("Accept");
			exit(2);
		}
		printf("Serveur: Connexion acceptee\n");
		if(fork()==0)
		{
			close(socket_ecoute);
			coderetour=client_nombre(socket_service,nb);
			printf("Le Code retour est: %d\n",coderetour);
			close(socket_service);
			//return coderetour;
			exit(coderetour);
		}
		else
		{
			close(socket_service);
		}
	}
	printf("code retour %d\n",coderetour);
	return 0;
}

Conclusion :


dans le zip
y a les fichiers creer_socket.c et creer_socket.h

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
5
Date d'inscription
dimanche 7 décembre 2003
Statut
Membre
Dernière intervention
24 juin 2004

Hmm, c'est une bonne idée d'avoir mis time() comme argument à srand()...mais il me semble que rend n'est pas un générateur aléatoire mais plutot pseudo-aléatoire...

sinon ahkrane, sous Linux ca compilera normalement impecc...si tu veux le compiler sous win il y a moyen mais il fa te falloir changer pas mal de chose :\
Messages postés
5
Date d'inscription
dimanche 7 décembre 2003
Statut
Membre
Dernière intervention
24 juin 2004

Hmm, c'est une bonne idée d'avoir mis time() comme argument à srand()...mais il me semble que rend n'est pas un générateur aléatoire mais plutot pseudo-aléatoire...

sinon ahkrane, sous Linux ca compilera normalement impecc...si tu veux le compiler sous win il y a moyen mais il fa te falloir changer pas mal de chose :\
Messages postés
1
Date d'inscription
vendredi 7 mars 2003
Statut
Membre
Dernière intervention
11 avril 2003

Bonjour, j'ai le même problème que Clem, j'ai pas les sys/wait...
Je suis sous windows (j'ai pas encore à ma disposition le pc sous linux ). Sous linux ça compilera?
Et si je veux que ça puisse compiler sous windows et linux, ya moyen?

Merci d'avance
Messages postés
141
Date d'inscription
mardi 30 avril 2002
Statut
Membre
Dernière intervention
23 mars 2005
1
TILOUPS c est ton jour de chance lol
Alors le fichier dans l encadre c est le serveur
appelle le server_alea.c
et compiles le comme decrit plus haut c est a dire
cc -c server_alea.c
cc -c creer_socket.c
cc -o server_alea.exe server_alea.o creer_socket.o

Ce code permet de faire tout ce que tu veux sauf la partie ou le serveur dit + grand ou + petit
Maintenant pour le client, il te suffit d aller ici pour l avoir

http://www.cppfrance.com/article.aspx?Val=1548

ce qu il y a dans l encadre tu l appelles client_alea.c
et tu compiles
cc -c client_alea.c
cc -c creer_socket.c
cc -o client_alea.exe client_alea.o creer_socket.o

j espere avoir ete assez clair sinon reposte un message
@++
Pheno
Messages postés
8
Date d'inscription
vendredi 14 février 2003
Statut
Membre
Dernière intervention
12 mars 2003

Salut
Selon la méthode décrite plus haut pour la compile. J'aimerais plus de détail. Le fichier zipper est le serveur et le fichier dans l'encadrer est le client est-ce bien ça. Ensuite quel est le nom a donner pour le fichier dans l'encadrer. Comment ça fonctionne au juste. Le fichier client est ou.

Car je veux créer un fichier client et serveur. Le client doit se connecter au serveur, le serveur doit penser a un nombre et le client doit le deviner. Le serveur doit l'aider en lui disant si le nombre que le client donne est plus petit ou plus grand que celui du serveur.

Donc je voulais trouver une référence pour m'aider dans la connexion client serveur. Merci de ton aide
Afficher les 9 commentaires

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.