IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Réseau C Discussion :

Problème avec les sockets et la fonction accept


Sujet :

Réseau C

  1. #1
    Futur Membre du Club
    Inscrit en
    Janvier 2007
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 16
    Points : 6
    Points
    6
    Par défaut Problème avec les sockets et la fonction accept
    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);
    }

  2. #2
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2006
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2006
    Messages : 35
    Points : 41
    Points
    41
    Par défaut
    Citation Envoyé par projeticq
    et voici mon fichier "mesfonctions_serv2.h"
    Du code dans un header???

  3. #3
    Futur Membre du Club
    Inscrit en
    Janvier 2007
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    Je suis d'accord, c'est pas très bien. Mais, ça ne change pas le problème..

  4. #4
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2006
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2006
    Messages : 35
    Points : 41
    Points
    41
    Par défaut
    Ben écoutes je sais pas trop, j'ai lu ton code ça m'a l'air tout à fait correct. Mais je ne comprends pas bien le problème, est ce tu pourrais donner un peu plus de détails sur l'execution de ton programme?

  5. #5
    Membre confirmé Avatar de Lunixinclar
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2006
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 416
    Points : 489
    Points
    489
    Par défaut
    Salut.
    1) En invoquant listen() avant la boucle plutôt que pendant ça donne quoi?

    2) Aussi le dernier argument de accept ne doit pas être casté en struct sockaddr* :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int accept(int sock, struct sockaddr *adresse, socklen_t *longueur);
    3) Vérifies les valeurs retournées pas bind() listen() accept() s'il y a un problème errno est positionné:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
       int ret;
       ret = bind(ma_socket,(struct sockaddr *)&mon_address, sizeof(mon_address));
       if (i!=0)
       {
         perror("bind()");
         exit(1);
       }
    4) Si ça ne marche toujours pas, enlèves tout le traitement des signaux pour réduire le code et isoler où ça bloque.

    5) Ah oui il y a aussi quelques erreurs de compilation.

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Ton serveur-fork ne fait rien pour quitter le fils, par conséquent celui-ci se retransforme en serveur...
    De plus, tu fais ton listen() dans la boucle.

    Et aussi, tu as des variables globales, dont la plupart sont inutiles car seul ma_socket est utilisé dans un handler de signal.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Futur Membre du Club
    Inscrit en
    Janvier 2007
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    Merci à vous j'ai enfin réussi à régler mon problème!!
    C'était à cause du fork..
    Je mettrai mon code en ligne lorsqu'il sera fini. C'est un bon exemple de communication avec les sockets.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [OCaml] Petit problème avec les sockets
    Par Fractal LLG dans le forum Caml
    Réponses: 3
    Dernier message: 28/02/2008, 12h18
  2. un serieux problème avec les sockets
    Par dc.sara dans le forum Réseau
    Réponses: 4
    Dernier message: 23/01/2008, 16h11
  3. problèmes avec les sockets
    Par lukbutor dans le forum Réseau
    Réponses: 24
    Dernier message: 23/04/2007, 01h12
  4. Problème avec les sockets
    Par projeticq dans le forum Réseau
    Réponses: 14
    Dernier message: 19/04/2007, 09h32
  5. [Win32] Problème avec les sockets
    Par mickael777 dans le forum MFC
    Réponses: 3
    Dernier message: 12/08/2005, 11h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo