CodeS-SourceS
Rechercher un code, un tuto, une réponse

Client/serveur: serveur nombre aleatoire [gcc]

Soyez le premier à donner votre avis sur cette source.

Vue 6 718 fois - Téléchargée 279 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

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.