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


Sujet :

Réseau C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 33
    Par défaut Client/Serveur
    Bonsoir,
    Avant tout je veux féliciter les modérateurs de ce site, que je trouve vraiment trés trés bien.
    pour mon problème, voila:
    j'essaye de faire une application client-serveur: un processus client qui demande soit résévation, soit consultation des place libre pour un événement(ex:film au cinéma). et un processus(pére-fils) serveur qui repond aux demandes des clients.
    je commancer avec le processus client et voila ce que j'ai fais:
    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
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
     
    [#include<errno.h>
    #include<sys/types.h>
    #include<sys/socket.h>
    #include<netinet/in.h>
    #include<netdb.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <stddef.h>
    #include <unistd.h>
    #include <time.h>
    #include <sys/time.h>
     
     
    #define PORTC 5000
    #define PORTS1 5100
    #define PORTS2 5200
     
    main(void){
    int sock;
    struct hostent *h;
    struct sockaddr_in sockin;
    char evenement[50];
    char type;
    char placelibre[10];
    socklen_t lg;
    int n;
    for( ; ; ){
    	printf("Pour fermer le programme , tapper ctrl+c .\n");
    	printf("entrer le identité de l'événement completé par la date: \n EX:spiderman3 1/12/08.\n");
    	fget(evenement,sizeof(evenement),stdin);
     
    	printf("que vouller vous faire :\n tapper 'R' pour reservation, ou tapper 'C' pour consultation.\n");
    	fget(type,1,stdin);
     
    /*consultation*/
    	if(type=='c'){
    		/*creation de socket*/
     
    		if((sock = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP))<0)
    		{
    		perror("erreur de creation socket");
    		exit(1);	
    		};
    /* mise a zero de la zone memoire d'adresse */
     
    	bzero(&sockin, sizeof(sockin));
     
    /* preparation de la structure adresse*/
     
    	sockin.sin_family=AF_INET;
    	sockin.sin_port =htons(PORTC); 
    	sockin.sin_addr.s_addr=INADDR_ANY; /*b n'import quelle adresse*/
     
    /*attachment socket*/
     
    	if( bind(sock,(struct sockaddr *)&sockin, sizeof(sockin))<0) {
    	perror("Erreur d'attachement: appel BIND");
    	exit (2);
    	}
     
    	if(!(h=gethostbyname("localhost")))  {
    		perror("erreur gethostbyname");
    		exit(3);
    	}
    	bzero(&sockin, sizeof(sockin));
    	sockin.sin_family = AF_INET;
    	memcpy(&sockin.sin_addr,h->h_addr,h->h_length);
    	sockin.sin_port= htons(PORTS1);
     
     
    	sendto(sock,evenement,50,0,(struct sockaddr *)&sockin,sizeof(sockin));
    	n=recvfrom(sock,placelibre,1,0,(struct sockaddr *)&sockin, sizeof(sockin));
     
    	if(strncmp(placelibre,"erreur !!",n-1)==0)
    	printf("desolé, cette evenement n'existe pas \n");
     
    	else	{
    		if(strncmp(placelibre,"réservation accépté !",n-1)==0)
    			printf("désolé, cette événement n'éxiste pas \n");
     
    		else
    			printf("erreur inconu!!");
    		}
    	close (sock);
     
    	}
     
    /*reservation*/
    	if(type=='R')
    	{
     
    	/*creation de socket*/
     
    	if((sock = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP))<0)
    		{
    		perror("erreur de creation socket");
    		exit(1);	
    		};
    /* mise a zero de la zone memoire d'adresse */
     
    	bzero(&sockin, sizeof(sockin));
     
    /* preparation de la structure adresse*/
     
    	sockin.sin_family=AF_INET;
    	sockin.sin_port =htons(PORTC);
    	sockin.sin_addr.s_addr=INADDR_ANY; /*b n'import quelle adresse*/
     
    /*attachment socket*/
     
    	if( bind(sock,(struct sockaddr *)&sockin, sizeof(sockin))<0) {
    		perror("Erreur d'attachement: appel BIND");
    		exit (2);
    		}
     
    	if(!(h=gethostbyname("localhost")))  {
    		perror("erreur gethostbyname");
    		exit(3);
    		}
    	bzero(&sockin, sizeof(sockin));
    	sockin.sin_family = AF_INET;
    	memcpy(&sockin.sin_addr,h->h_addr,h->h_length);
    	sockin.sin_port= htons(PORTS2);
     
    	sendto (sock,evenement,50,0,(struct sockaddr *)&sockin, sizeof(sockin));
    	n=recvfrom(sock,placelibre,10,0,(struct sockaddr *)&sockin, sizeof(sockin));
     
    	if(strncmp(placelibre,"erreur !!",n-1)==0)
    		printf("desolé, cette evenement n'existe pas \n");
     
    	else	{
    		if(strncmp(placelibre,"réservation accépté !",n-1)==0)
    			printf("désolé, cette événement n'éxiste pas \n");
     
    		else
    			printf("erreur inconu!!");
    		}
    	close (sock);
     
    	}
    	else printf("erreur de frappe, redemarer le programme!");
    }
    }
    peut être vous allez trouver que c'est pas assez professionnelle, c'est que je ne suis qu'un débutant: oops:

    après la compilation je trouve :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    [xxx@localhost ~]$ gcc -o clien client.c
    client.c: In function ‘main’:
    client.c:73: attention : passing argument 6 of ‘recvfrom’ makes pointer from integer without a cast
    client.c:129: attention : passing argument 6 of ‘recvfrom’ makes pointer from integer without a cast
    /tmp/cckM7zJU.o: In function `main':
    client.c: (.text+0x48): undefined reference to `fget'
    client.c: (.text+0x71): undefined reference to `fget'
    collect2: ld a retourné 1 code d'état d'exécution
    [xxx@localhost ~]$
    j'ai essayer de chercher moi même sur le net , mais sans résultat, si qq peux me fournir une indication ca sera plusque génial. merci d'avance

  2. #2
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    client.c: In function ‘main’:
    gcc a trouvé quelque chose d'anormal dans le fichier client.c, à l'intérieur de la fonction 'main'.
    client.c:73: attention : passing argument 6 of ‘recvfrom’ makes pointer from integer without a cast
    On en a un à la ligne 73, il s'agit d'un avertissement ("attention") : on passe, en 6ème argument de 'recvfrom', un entier là où un pointeur est attendu. Allons voir ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    n = recvfrom(sock, placelibre, 1, 0, (struct sockaddr *)&sockin, sizeof(sockin));
    Le 6ème argument c'est sizeof(sockin). Ceci est incorrect car recvfrom nécessite en 6ème argument l'adresse d'un int et non un int. Cette adresse est utilisée en entrée pour lire (à partir de l'emplacement pointé) la taille du buffer (sockin) dont l'adresse est passée en 5ème argument et en sortie pour écrire le nombre d'octets effectivement écrits dans ce même buffer. Correction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int sizeof_sockin = sizeof(sockin);
    ...
    n = recvfrom(sock, placelibre, 1, 0, (struct sockaddr *)&sockin, &sizeof_sockin);
    Même problème à la ligne 129.

    Ensuite tu utilises une fonction fget qui n'a pas été définie. T'as du oublié un s (fgets).

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 33
    Par défaut
    j'ai fais ce que vous m'avez dis, mais j'ai la réponse qu'il ne connais pas "&sizeof_sockin",
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    client.c: In function ‘main’:
    client.c:32: attention : passing argument 1 of ‘fgets’ makes pointer from integer without a cast
    client.c:73: erreur: ‘sizeof_sockin’ undeclared (first use in this function)
    client.c:73: erreur: (Each undeclared identifier is reported only once
    client.c:73: erreur: for each function it appears in.)
    , alors je l'ai remplacer pas "&lg" , et j'ai remplacer aussi fgets(type,1,stdin) par fgets(&type,10,stdin);

    mnt tout marche bien,(jusqu'à mnt ) mnt je vais essayer de dévlopper les deux applications serveurs.
    mérci pour votre aide, c'est bien ce que j'attendais comme sérvice de votre site vous êtes bien les meilleurs.
    merci bien

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    le fgets(&type, 10, stdin) est très mauvais, car type est un seul caractère.
    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.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 33
    Par défaut
    qu'est ce que vous proposer? (fgets a bien fait l'affaire)

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    De changer le type de type de char à tableau de char, et de régler le troisième paramètre de fgets() en conséquence.
    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
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 33
    Par défaut
    puiceque j'ai besoin de lire un seul char,(soit 'C' pour consultaion ou 'R' pour reservation) alors ca change pas grand chose!!

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Sauf qu'il en faut minimum 2 pour fgets(), à cause du carctère nul.
    Et n'oublie pas de régler le dernier paramètre.
    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.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 33
    Par défaut
    merci pour tout.

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

Discussions similaires

  1. Web contre client/serveur que choisir??
    Par silvermoon dans le forum Débats sur le développement - Le Best Of
    Réponses: 41
    Dernier message: 24/01/2004, 15h53
  2. Quel outil pour du développement Client/Serveur (Win XP) ?
    Par jey_bonnet dans le forum Débats sur le développement - Le Best Of
    Réponses: 5
    Dernier message: 02/11/2002, 14h57
  3. Réponses: 2
    Dernier message: 01/10/2002, 12h25
  4. comment gerer plusieurs connexions client/serveur
    Par naili dans le forum C++Builder
    Réponses: 3
    Dernier message: 14/08/2002, 16h58
  5. Langage le mieux adapté pour application client serveur ?
    Par guenus dans le forum Débats sur le développement - Le Best Of
    Réponses: 4
    Dernier message: 17/06/2002, 15h46

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