我目前正在研究服务器/客户端unix套接字项目。 这是一个纸牌游戏。当服务器给卡时我遇到了问题。
我使用这些结构:
typedef struct Carte {
int valeur;
enum Couleur {COEUR,CARREAU,TREFLE,PIQUE} couleur;
} Carte;
typedef struct Message {
int type;
char message[256];
Carte cartes[4];
} Message;
typedef struct Noeud {
Carte* carte;
struct Noeud* suivant;
} Noeud;
typedef struct Joueur {
char nom[50];
int points;
int nombreCarteDeck;
int nombreCarteReserve;
Carte deck[52];
Carte reserve[52];
int indice;
} Joueur;
当我在gdb中启动此功能时:
void distributionCarte( Joueur(* joueurs)[] , int nbreJoueurs, int (* client_socket)[], Message (* messages)[], fd_set * readfds ) {
int val;
int coul;
Carte cartes[nbreJoueurs][52/nbreJoueurs];
Noeud* courant = (Noeud*)malloc(1*sizeof(Noeud));
Noeud* premier = courant;
Carte* carte;
for(val = 1; val < 14; val++){
for(coul = 1; coul < 5; coul++){
carte = (Carte*)malloc(1*sizeof(Carte));
carte->valeur = val;
carte->couleur = coul;
courant->carte = carte;
if(val != 13 || coul != 4){
courant->suivant = (Noeud*)malloc(1*sizeof(Noeud));
courant = courant->suivant;
}
}
}
courant->suivant = premier;
Noeud* test = premier;
int i;
int j;
Carte* carteADonner;
int random;
int joueur;
int nbreCartes[nbreJoueurs];
for(joueur = 0; joueur<nbreJoueurs; joueur++){
nbreCartes[joueur] = 0;
}
joueur = 0;
for(i = 1; i < 53; i++){
srand(time(NULL)*i);
random = rand()%52;
for(j = 0; j<random; j++){
courant = courant->suivant;
}
carteADonner = courant->suivant->carte;
courant->suivant = courant->suivant->suivant;
int indice = nbreCartes[joueur]++;
cartes[joueur][indice] = *carteADonner;
joueur++;
if(joueur >= nbreJoueurs)joueur = 0;
}
Message mes;
for(i = 0; i<nbreJoueurs; i++){
FD_SET((*client_socket)[i], readfds);
for(j = 0; j < 52/nbreJoueurs; j++){
printf("joueur = %d, valeur = %d, couleur = %d\n", i+1, cartes[i]
[j].valeur, cartes[i][j].couleur);
mes.cartes[j] = cartes[i][j];
mes.type = DISTRIBUTION_CARTE;
strncpy(mes.message,"\0",1);
(*messages)[(*joueurs)[i].indice] = mes;
writeMessageForClient((*joueurs)[i].indice, *messages, readfds,
client_socket , nbreJoueurs);
}
}
printf("DISTRIBUTION_CARTE FINI \n");
}
我明白了:
.... // n times joueur = %d , valeur = %d , couleur = %d
joueur = 2, valeur = 9, couleur = 3
joueur = 2, valeur = 11, couleur = 4
joueur = 2, valeur = 3, couleur = 1
joueur = 2, valeur = 12, couleur = 1
DISTRIBUTION_CARTE FINI
*** stack smashing detected ***:
/media/sf_SHARED_FOLDER_LINUX/projetUnix/Server terminated
Program received signal SIGABRT, Aborted.
0x00007ffff7826267 in __GI_raise (sig=sig@entry=6)
at ../sysdeps/unix/sysv/linux/raise.c:55
55 ../sysdeps/unix/sysv/linux/raise.c: No such file or directory.
(gdb) where
#0 0x00007ffff7826267 in __GI_raise (sig=sig@entry=6)
at ../sysdeps/unix/sysv/linux/raise.c:55
#1 0x00007ffff7827eca in __GI_abort () at abort.c:89
#2 0x00007ffff7869c53 in __libc_message (do_abort=do_abort@entry=1,
fmt=fmt@entry=0x7ffff797fdad "*** %s ***: %s terminated\n")
at ../sysdeps/posix/libc_fatal.c:175
#3 0x00007ffff7909e8c in __GI___fortify_fail (msg=<optimized out>,
msg@entry=0x7ffff797fd95 "stack smashing detected") at fortify_fail.c:38
#4 0x00007ffff7909e30 in __stack_chk_fail () at stack_chk_fail.c:28
#5 0x0000000000402710 in distributionCarte ()
#6 0x0000000200000001 in ?? ()
#7 0x0000000a00000001 in ?? ()
#8 0x0000000600000003 in ?? ()
#9 0x0000000800000002 in ?? ()
#10 0x0000000500000002 in ?? ()
#11 0x0000000300000003 in ?? ()
#12 0x0000000200000004 in ?? ()
#13 0x0000000400000002 in ?? ()
#14 0x0000000d00000003 in ?? ()
#15 0x0000000900000003 in ?? ()
#16 0x0000000b00000003 in ?? ()
#17 0x0000000300000004 in ?? ()
#18 0x0000000c00000001 in ?? ()
那么,我做错了什么?