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 :

Client/Serveur : le client se déconnecte tout seul


Sujet :

Réseau C

  1. #1
    Membre régulier
    Inscrit en
    Octobre 2006
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 90
    Points : 72
    Points
    72
    Par défaut Client/Serveur : le client se déconnecte tout seul
    Hello,

    J'ai un prog 'serveur.c' et un prog 'client.c' qui marche bien : mais qui ne font pas grand chose.
    -> le serveur affiche la connexion du client
    -> le serveur envoi un message au client
    -> le client recoi le message du serveur et l'affiche ds la console
    -> le client envoi un message au serveur
    -> le serveur affiche le message du client ds la console serveur.

    Voila et a la fin le serveur reste ouvert, par contre le client se ferme !!

    Voici mon code 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
    #include <stdio.h>
    #include <stdlib.h>
    #include <errno.h>
    #include <string.h>
    #include <sys/types.h>
    #include <netinet/in.h>
    #include <sys/socket.h>
    #include <sys/wait.h>
    #include <string.h>
     
    #define MYPORT 3490    /* Le port ou les utilisateurs se =connecteront */
     
    #define BACKLOG 10     /* Nombre maxi de connections acceptees en file */
    #define MAXDATASIZE 200 /* Tampon d'entree */
     
    main()
    {
    	//variables nécessaires Ã* la préparation du message Ã* envoyer
    	char mess[] = "Hello, num ";
    	int len = strlen(mess) +50;
    	char buf_mess[len];
    	int cpt = 0;
     
    	char buf[MAXDATASIZE];
     
    	//vairable client serveur
    	int sockfd, new_fd, numbytes;  /* Ecouter sock_fd, nouvelle connection sur new_fd */
    	struct sockaddr_in my_addr;    /* Adresse */
    	struct sockaddr_in their_addr; /* Adresse du connecte  */
    	int sin_size;
     
     
    	if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
    	{
    		perror("socket");
    		exit(1);
    	}
     
    	my_addr.sin_family = AF_INET;         /* host byte order */
    	my_addr.sin_port = htons(MYPORT);     /* short, network byte order */
    	my_addr.sin_addr.s_addr = INADDR_ANY; /* auto-remplissage avec mon IP */
    	//bzero(&(my_addr.sin_zero), 8);        /* zero pour le reste =de struct */
     
    	if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1)
    	{
    		perror("bind");
    		exit(1);
    	}
     
    	if (listen(sockfd, BACKLOG) == -1)
    	{
    		perror("listen");
    		exit(1);
            }
     
    	while(1) 
    	{  /* main accept() loop */
    		sin_size = sizeof(struct sockaddr_in);
    		if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size)) == -1)
    		{
    			perror("accept");
    			continue;
    		}
     
    		printf("serveur: Recu connection de %s\n", inet_ntoa(their_addr.sin_addr));
     
    		if (!fork())
    		{ /* processus fils */
    			cpt = cpt + 1;
    			//construction du message Ã* envoyer
    			snprintf(buf_mess, len, "%s %d", mess, cpt);
     
    			//envoi du message
    			if (send(new_fd, buf_mess, 14, 0) == -1)
    				perror("send");
     
    			close(new_fd);
    			exit(0);
    		}
     
    		if ((numbytes=recv(new_fd, buf, MAXDATASIZE, 0)) == -1)
    		{
    			perror("recv");
    			exit(1);
    		}
    		buf[numbytes] = '\0';
     
    		printf("Recu: %s\n",buf);
     
    		close(new_fd);  /* Le parent n'a pas besoin de cela */
     
    		while(waitpid(-1,NULL,WNOHANG) > 0); /* Nettoyage des processus fils */
    	}
    }
    et mon code client :
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <errno.h>
    #include <string.h>
    #include <netdb.h>
    #include <sys/types.h>
    #include <netinet/in.h>
    #include <sys/socket.h>
     
    #define PORT 3490    /* Le port ou le client se connectera */
     
    #define MAXDATASIZE 200 /* Tampon d'entree */
     
    main()
    {
    	int sockfd, numbytes;
    	char buf[MAXDATASIZE];
    	struct hostent *he;
    	struct sockaddr_in their_addr; /* Adresse de celui qui se connecte */
     
     
    	if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
    	{
    		perror("socket");
    		exit(1);
    	}
     
    	their_addr.sin_family = AF_INET;      /* host byte order */
    	their_addr.sin_port = htons(PORT);    /* short, network byte order */
    	//their_addr.sin_addr = *((struct in_addr *)he->h_addr);
    	their_addr.sin_addr.s_addr = INADDR_ANY;
    	//bzero(&(their_addr.sin_zero), 8);     /* zero pour le reste de struct */
     
    	if (connect(sockfd, (struct sockaddr *)&their_addr, sizeof(struct sockaddr)) == -1)
    	{
    		perror("connect");
    		exit(1);
    	}
     
    	if ((numbytes=recv(sockfd, buf, MAXDATASIZE, 0)) == -1)
    	{
    		perror("recv");
    		exit(1);
    	}
     
    	buf[numbytes] = '\0';
    	printf("Recu: %s\n",buf);
     
    	//test de l'envoi pour un client
    	if (send(sockfd, "client", 14, 0) == -1)
    		perror("send");
     
    	close(sockfd);
     
    	return 0;
        }

  2. #2
    Membre régulier Avatar de psyphi
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    119
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Allemagne

    Informations professionnelles :
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2006
    Messages : 119
    Points : 120
    Points
    120
    Par défaut
    Quel est ton problème?
    Le serveur reste ouvert, oui car il boucle indéfiniment en attente d'une connection cliente.
    Le client fait son travail et se ferme, quoi de plus normal?
    Mon blog: http://blog.bores.fr
    Mon wiki: http://bores.fr/wiki
    Mes programmes libres: https://github.com/tbores

  3. #3
    Membre régulier
    Inscrit en
    Octobre 2006
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 90
    Points : 72
    Points
    72
    Par défaut
    ok,

    Et si mon client veut envoyer plusieurs messages ?

    J'ai ajouter une boucle 'while' pour le send côté client. Mais le serveur doit être aussi modifié !?!? mais comment ?

  4. #4
    Membre régulier Avatar de psyphi
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    119
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Allemagne

    Informations professionnelles :
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2006
    Messages : 119
    Points : 120
    Points
    120
    Par défaut
    Et si mon client veut envoyer plusieurs messages ?
    Il faut utiliser une fonction send par message que tu veux envoyer.

    J'ai ajouter une boucle 'while' pour le send côté client. Mais le serveur doit être aussi modifié !?!? mais comment ?
    Tu n'as pas besoin de la boucle while dans le client.
    A chaque send du client doit correspondre un recv du serveur et inversement.

    Si le serveur boucle indéfiniment, ce n'est pas pour l'envoie/réception de messages mais dans l'attente d'éventuels autres clients.
    Mon blog: http://blog.bores.fr
    Mon wiki: http://bores.fr/wiki
    Mes programmes libres: https://github.com/tbores

  5. #5
    Membre régulier
    Inscrit en
    Octobre 2006
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 90
    Points : 72
    Points
    72
    Par défaut
    ok,

    Mais comment faire pour qu'un client puisse envoyer plusieurs messages ?
    Et par exemple faire deconnecter le client s'il presse 'echap' ?

  6. #6
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Sakapatate
    Mais comment faire pour qu'un client puisse envoyer plusieurs messages ?
    Et par exemple faire deconnecter le client s'il presse 'echap' ?
    boucles, threads...

    Pour 'echap', je ne recommande pas, mais une bonne vielle commande locale genre 'quit', OK.
    Pas de Wi-Fi à la maison : CPL

  7. #7
    Membre régulier
    Inscrit en
    Octobre 2006
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 90
    Points : 72
    Points
    72
    Par défaut
    Merci Manu pr les info.
    Encore une question, où puis-je trouver une exemple d'utilisation des threads en C ?

  8. #8
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Sakapatate
    Merci Manu pr les info.
    Encore une question, où puis-je trouver une exemple d'utilisation des threads en C ?
    http://emmanuel-delahaye.developpez.com/pthreads.htm
    Pas de Wi-Fi à la maison : CPL

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 06/11/2008, 16h38
  2. [Client/serveur] Compiler Client / Serveur
    Par torNAdE dans le forum Linux
    Réponses: 3
    Dernier message: 20/10/2008, 22h08
  3. Réponses: 7
    Dernier message: 22/01/2008, 08h05
  4. Perl uniquement serveur ou Client/Serveur?
    Par alexandred dans le forum Web
    Réponses: 4
    Dernier message: 18/02/2006, 00h06
  5. Client-Serveur Dcom = Client+Serveur lancés sur la machine ?
    Par Jilam dans le forum Bases de données
    Réponses: 6
    Dernier message: 27/07/2004, 14h55

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