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