Bonjour à tous, voilà j'ai un problème sur les sockets qui se pose depuis un petit moment. Cela fait un mois que je bloque dessus, un coup de pouce de la part de n'importe qui serait le bienvenue!!
Je pose mon problème:
Je dois faire un serveur et un client. Pour le client pas de problème mais pour le serveur, ça marche une première fois et ensuite la fonction accept me remet toutes mes variables à 0, même les variables globales alors je ne comprends pas!!!
Voici mon code avec quelques printf qui me servent à voir où sont les erreurs..
Merci à qui peut m'aider
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
 
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <arpa/inet.h>
#include <sys/wait.h>
 
#include <netdb.h>
#include <unistd.h>
#include <fcntl.h>
 
#include <grp.h>
#include <pwd.h>
#include <errno.h>
#include <time.h>
 
#define PORT 12345
#define LISTE_ATTENTE 5
#define MAX_CARACT 999
#define MAXCONTACTS 999
 
void fin (int i);
void appli(int no_client_socket);
int ma_socket;
int client_socket=-1;
extern int errno;
void ecoute(void);
void SIGCHLD_handler(void);
void SIGINT_handler(void);
char buffer[MAX_CARACT];
char connexion[MAX_CARACT];
struct sigaction action;
int test;
#include "mesfonctions_serv2.h"
 
int main ( void )
{
printf("DEBUT!!!!!!!!\n");
ecoute();
return EXIT_SUCCESS;
}

et voici mon fichier "mesfonctions_serv2.h"

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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
 
void ecoute(void)
{
 
	sigset_t ens , ens_old;
	struct sockaddr_in mon_address, client_address;
	int mon_address_longueur, lg=512;
	char nom_utilisateur[MAX_CARACT];
	char etat[MAX_CARACT];
 
	strcpy(connexion,"non connecté");
	test=0;
	printf("INITIALISATION\n");
	bzero(&mon_address,sizeof(mon_address));
	mon_address.sin_port = htons(PORT);
	mon_address.sin_family = AF_INET;
	mon_address.sin_addr.s_addr = htonl(INADDR_ANY);
 
	/* creation de socket */
	if ((ma_socket = socket(AF_INET,SOCK_STREAM,0))== -1)
	{
  		printf("Problème avec la creation\n");
  		exit(0);
	}
 
	sigfillset(&ens);
	sigdelset(&ens , SIGINT);
	sigdelset(&ens , SIGCHLD); 
	sigprocmask(SIG_SETMASK , &ens , &ens_old ) ;
 
	action.sa_handler = SIGCHLD_handler;
	action.sa_mask = ens;
	action.sa_flags = SA_RESTART;
 
	if ( sigaction(SIGCHLD , &action , NULL) == -1 )
	{
		perror("sigaction");
  		exit(1);
	}
 
 
	setbuf(stdout, NULL);
	setbuf(stdin, NULL);
	signal(SIGINT, SIGINT_handler);
	signal(SIGCHLD , SIGCHLD_handler);
 
	bind(ma_socket,(struct sockaddr *)&mon_address,sizeof(mon_address));
 
   	while(1)
   	{
 
		/* ecoute sur la socket */
		listen(ma_socket,LISTE_ATTENTE);
 
		/* accept la connexion */
		mon_address_longueur = sizeof(client_address);
sleep(1);
		printf("ETAT DU BUFFER: '%s' ; ETAT DE CONNEXION: '%s' et test = %d \n",buffer,connexion,test);
 
		printf("Etape 0 et %s et client socket=%d et lg=%d et masocket=%d\n",connexion,client_socket,lg,ma_socket);
 
		client_socket = accept(ma_socket,
                 	         (struct sockaddr *)&client_address,
                 	         (struct sockaddr *)&mon_address_longueur);
 
    		printf("Etape 1 et %s et adresse du client = %s\n",connexion,inet_ntoa(client_address.sin_addr));
 
		/* ********************************************************
		***************** Reception des données*********************
		************************************************************/
 
   		if (fork() == 0)
   		{
 
     			lg = read(client_socket,buffer, MAX_CARACT);
    			printf("Le client envoit le mot :'%s' et il est %s\n",buffer,connexion);
 
/****************************Enregistrer les données du client dans le serveur*******************************/
 
			if(!strcmp(connexion, "demande_etat"))
			{
				strcpy(etat,buffer);
				strcpy(connexion,"connecté");
				test=2;
				printf("Etat de l'utilisateur : %s\n",etat);
			}
 
			if(!strcmp(connexion, "demande_pseudo"))
			{
				strcpy(nom_utilisateur,buffer);
				strcpy(connexion,"demande_etat");
				test=3;
				printf("Nom d'utilisateur : %s\n",nom_utilisateur);
			}
 
			if(!strcmp(buffer, "connexion") && !strcmp(connexion, "non connecté") )
			{
				printf("Etat?\n");
				strcpy(connexion,"demande_pseudo");
				test=1;
 
				printf("Affichage de i : %s\n",connexion);
			}
      			write(client_socket,buffer, MAX_CARACT);
     		}
   	}	
 
}
 
 
 
void SIGCHLD_handler(void)
{
	printf("Etape 9 et %s\n",connexion);
	wait(NULL);
	printf("Etape 10 et %s\n",connexion);
	printf("fils mort\n");
}
 
void SIGINT_handler(void)
{
	printf("SIGINT\n");
	if ( shutdown(ma_socket , 2)==-1){
	perror("shutdown");
	}
	else
	close(ma_socket);
  	exit(0);
}