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

C Discussion :

dialogue client-server comportement incrompréhensible


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2012
    Messages : 6
    Par défaut dialogue client-server comportement incrompréhensible
    bonjour,
    cela fait plusieurs heures que je bute sur un problème :
    j'ai réalisé un dialogue entre un client et un serveur je vous présente le 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
    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
    #include"network.h"
     
    #include"game.h"
     
    #include<stdlib.h>
     
    #include<string.h>
     
    #include<stdio.h>
     
    #define SYS(call) ((call)==-1)?(perror(#call),exit(1)):0
     
    #include <stdlib.h>
     
    #include <stdio.h>
     
     
    #define noirTexte 30
    #define rougeTexte 31
    #define vertTexte 32
    #define jauneTexte 33
    #define bleuTexte 34
    #define magentaTexte 35
    #define cyanTexte 36
    #define blancTexte 37
    #define noirFond 40
    #define rougeFond 41
    #define vertFond 42
    #define jauneFond 43
    #define bleuFond 44
    #define magentaFond 45
    #define cyanFond 46
    #define blancFond 47 	
    #define couleurOn(A,B,C) printf("\033[%d;%d;%dm",A,B,C)
    #define couleurOff() printf("\033[0m");
     
    void afficherCarte(carte ca){
    	if(ca.couleur == 1){
    		couleurOn(0,blancFond,noirTexte);
    	}
    	else{
    		couleurOn(0,noirFond,blancTexte);
    	}
    	printf("|%d|",ca.numero);
    	couleurOff();
    }
    int main(int argc, char** argv) {
    	int sck;
    	char buffer[256];
    	int size;
    	game me;
    	message mes;
    	if(argc != 2){
    		printf("argument !! \n");
    		exit(1);
    	}
    	if((sck = connectClient("127.0.0.1",*(argv+1))) == -1){
    		printf("impossible de se connecter\n");
    	}
    	else{
    		printf("entrez un identifiant\n");
    		SYS(size = read(1,buffer,10));
    		SYS(write(sck,buffer,size));
    		printf("en attente du démarrage de la partie\n");
    		do{
    			SYS(size = read(sck,&mes,sizeof(mes)));
    			if(mes.type == 1){
    				printf("égale à 1\n");
    				int i;
    				int nbit;
    				SYS(read(sck,&me,sizeof(game)));
    			printf("votre jeu nombre de carte  : %d \n",me.nbrCarte);
    				printf("votre identifiant : %s",me.id);
    				nbit = me.nbrCarte;
    				printf("avant boucle\n");
    				for(i=0;i<nbit;i++){
    					afficherCarte(me.main[i]);
    				}
    			}
    			else{
    				printf("EGALE A : %d",mes.type);
    				SYS(size = read(sck,buffer,255));
    				buffer[size] = '\0';
    				printf("votre identifiant est %s : et de taille = %d",buffer,size);	
    			}
    			sleep(5);
    		}while(1);
    	}
    	return 0;
    }
    lorsque je lance le client et le serveur, tout se passe à merveille sauf une chose :
    le client semble bloqué sur la boucle for , en effet, la dernière chose afficher à la console est :
    avant boucle et puis plus aucune affichage.
    si je recompile en mettant une printf dans la boucle et 2,3 autres dans la fonction afficherCarte , il n'y a aucune problème . Je me demande donc pourquoi un printf permettrait au thread d'opérer sa tâche et l'absence de celui-ci l'en empêche.
    la résolution du problème m'a l'air un peu spécial et j'espère d'ailleurs, ne pas passer pour un mytho.

    Ma première supposition était que le serveur, mal codé n'envoyant pas la totalité des octets dans le socket ce qui conduit donc à un appel bloquant, dès lors l'appel bloquant devrait se trouver sur la lecture du socket et non sur la boucle.

    Si vous avez la moindre idée, piste , suggestion, bref ... je suis preneur !

    edit : ce qui est intéressant c'est que le thread client semble se débloquer et effectuer sa tâche, lorsque le serveur se fait killé ?! Du coté serveur, je gère l'ensemble des game par l'intermédiaire d'une mémoire partagée entre pére et fils synchronisé par sémaphore, une erreur de deadlock ne peut pas se dérouler coté client ?!

    ps : si vous désirez plus de code voir même son intégralité, je le posterais directement

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2012
    Messages : 6
    Par défaut
    un petit fflush(stdout) après l'écriture a permit d'arranger le problème.
    j'ai complètement oublié que stdin était bufferisé.

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

Discussions similaires

  1. [TClientSocket] Dialogue client/serveur Delphi 6
    Par Hikaru dans le forum Web & réseau
    Réponses: 6
    Dernier message: 31/03/2009, 10h28
  2. [C] Dialogue Client/Server
    Par Dimitri_87 dans le forum Développement
    Réponses: 4
    Dernier message: 02/09/2006, 14h39
  3. [Reseau] Dialogue client-serveur
    Par Nasky dans le forum Entrée/Sortie
    Réponses: 11
    Dernier message: 08/08/2005, 15h07
  4. [réseau] [client/server] Transmettre la sortie standard
    Par legzo dans le forum Entrée/Sortie
    Réponses: 8
    Dernier message: 30/06/2005, 16h15
  5. [ado][sql server] CLIENT/SERVER
    Par nil dans le forum Bases de données
    Réponses: 3
    Dernier message: 23/04/2004, 08h12

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