hello tout le monde

Je suis en train creer un serveur qui accepte un nombre limite de clients. De plus, (sa mission principale), il doit mettre le numero du socket client dans une structure(caracteristiques : no du socket, nom du client et un champs "points") afin de pouvoir differencier chaque client.

Le probleme est que lorsque je veux afficher mes structures, elles n'existent pas (elles ne sont pas tjs pas initialisee) alors qu'elles le sont dans le processus fils.

Apparement le probleme serait que lorsque je cree un nouveau socket, je dupplique alors le processus (avec le fork) ), donc tous mes clients inserent leur donnees dans la meme structure (joueur[0]), heuuu du moins c'est ce que je crois avoir compris de l'erreur.

Si quelqu'un avait une idee de "comment faire pour bien initialiser les structures", et bien je lui serait vraiment tres reconnaissant :o


Cela fait 2 jours que j'essaie de resoudre ce probleme sans succes


Voici le code du serveur :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
 
/* declaration des librairies */
 
 
#define DEBUG_SERVER 1
 
 struct _joueur{
	int id_j;
        char nom[50];
        int pts;
};
 
struct _joueur joueur[4];
 
main(int argc, char *argv[]){
 
  /********declaration*********/
  int sock_rv; 			/*socket de rendez-vous */
  int socket_serv;		/*socket de service  */ 
  char buf[256];    			/* buffer*/
  struct sockaddr_in adr; 	/*structure d'une adresse (Sun) */
  struct sockaddr_in adresse;    
  int lgadr,lgadresse;		/* longueur de l'adresse*/
  struct hostent *hote;		/*infos sur l'hote*/
  char nomh[50];		/*nom de l'hote*/ 
  int nbJoueur=0;		/*Nombre de joueurs actuel */
 
  int i; 
  /****************************/
 
  /*creation de la socket de rendez-vous */
  if((sock_rv = socket(AF_INET, SOCK_STREAM, 0)) == -1){
	perror("probleme avec la creation de la socket d'ecoute");
	exit(1);
  }
 
  /* recuperation du nom de la machine presente */
  if (gethostname(nomh, 50) == -1) {
	perror("pb dans le gethostbyname");
	exit(1);
  }
 
 
  /* preparation de l'adresse locale : port + toutes les @ IP */
  adr.sin_family = AF_INET;
  adr.sin_port = htons(atoi(argv[1]));
  adr.sin_addr.s_addr = htonl(INADDR_ANY);
 
/* attachement de la socket a l'adresse locale */
  lgadr = sizeof(adr);
  if ((bind(sock_rv, &adr, lgadr)) == -1) {
	perror("bind"); 
	exit(1);
  }
 
  /*Declaration du service d'ecoute */
  if(listen(sock_rv, 4)==-1){
	perror("probleme avec le service d'ecoute");
	exit(1);
  }
 
  /*boucle d'attente de connexion */ 
  while(nbJoueur++<4){
	fflush(stdout);
 
	lgadresse = sizeof(adresse);
	socket_serv=accept(sock_rv, &adresse, &lgadresse);
	if(socket_serv==-1 &&errno==EINTR)
		continue;
 
	if(socket_serv==-1){
		perror("probleme lors de la creation socket_serv\n");
		exit(1);
	}
 
	if(!fork()){
		close(sock_rv);	
 
		if(read(socket_serv, buf,sizeof(buf))==-1){
			perror("probleme lors de la lecture");
			exit(1);
		}
 
		 /*initialisation de la structure */
		strcpy(joueur[nbJoueur].nom, buf);
		joueur[nbJoueur].id_j=socket_serv;
		joueur[nbJoueur].pts=0;
 
  		if(write(socket_serv, buf, sizeof(buf))==-1){
        		perror("pb lors de l'ecriture de la socket pour le serveur");
        		exit(1);
 
 
  		}  
	close(socket_serv);
	exit(0);
	}
 
}
 
  #if DEBUG_SERVER
	printf("tableau de joueur\n");
	printf("nbJoueur : %d\n", nbJoueur);
	for(i=0; i<nbJoueur;i++){
		printf("joueur %d\n\t id: %d \n\t nom : %s\n\t pts : %d\n",i,joueur[nbJoueur].id_j, joueur[nbJoueur].nom, joueur[nbJoueur].pts);	}
  #endif
  close(sock_rv);
}


Merci!