begin process at 2010 02 10 07:10:11
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Réseaux & Internet

 > CLIENT/SERVEUR: SERVEUR NOMBRE ALEATOIRE [GCC]

CLIENT/SERVEUR: SERVEUR NOMBRE ALEATOIRE [GCC]


 Information sur la source

Note :
Aucune note
Catégorie :Réseaux & Internet Niveau :Initié Date de création :05/03/2003 Date de mise à jour :07/03/2003 08:01:39 Vu / téléchargé :4 590 / 204

Auteur : pheno

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

 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

  • #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;
  • }
#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  

 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/SERVEUR: CLIENT NOMBRE ALEATOIRE [GCC]
TIMESTAMP, ECRITURE DANS UN FICHIER [GCC]
Source avec Zip TABLEAU DE STRUCTURES EN C, GESTION D ARRIVEES DE SKIEURS
FACTURATION AVEC UTILISATION DES TABLEAUX DE STRUCTURES EN C

 Sources de la même categorie

Source avec Zip TIM_RESEAU, CLASSES POUR RESEAU COMPLET par williamallas
Source avec Zip INTERNET IP FINDER TROUVER VOS ADRESSE IP (INTERNET) par xmustapha
Source avec Zip CLIENT/SERVEUR AVEC TSOCKETSERVER & TCLIENTSOCKET par xmustapha
Source avec Zip REMOTE SHELL GEN par ganjarasta
PROXY IRC SIMPLE (WINDOWS/WINSOCK) par _michel

Commentaires et avis

Commentaire de Galett le 06/03/2003 21:21:08

et si (cas très peu probable), il y a redondance du nombre ? y'click gauche ? y'click droite ? Y'a bug ?
:o)

Commentaire de pheno le 07/03/2003 07:59:45

Comment ca?
tu veux dire si 2 fois consecutivement le même nombre est choisi?
si c est ca, il n y a pas de bug
Il faudra juste redonner le même nombre pour gagner

Commentaire de Clem le 07/03/2003 19:28:25

Il me manque sys/wait.h, netinet/in.h, netdb.h et arpa/inet.h, quelqu'un veut bien me les envoyer s'il vous plait ?

Commentaire de pheno le 08/03/2003 11:16:59

Clem tu compiles le code source sous linux ???

Commentaire de tiloups le 12/03/2003 14:11:40

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

Commentaire de pheno le 12/03/2003 17:03:47

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

Commentaire de ahkrane le 11/04/2003 09:53:28

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

Commentaire de tiggy le 12/06/2004 14:23:59

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 :\

Commentaire de tiggy le 12/06/2004 14:25:29

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 :\

 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
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 : 0,811 sec (4)

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