Unix Socket - 信号SIGABRT

时间:2016-05-17 12:36:25

标签: sockets unix send

我目前正在研究服务器/客户端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 ?? ()

那么,我做错了什么?

0 个答案:

没有答案