Sockets Unix套接字-信号SIGABRT

Sockets Unix套接字-信号SIGABRT,sockets,unix,send,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]; } Mess

我目前正在从事服务器/客户端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");
}
void distributionCarte(jouer(*jouers)[],int-nbrejouers,int(*client_socket)[],Message(*messages)[],fd_set*readfds){
int-val;
国际法院;
点菜[NBREjouers][52/NBREjouers];
Noeud*courant=(Noeud*)malloc(1*sizeof(Noeud));
Noeud*premier=courant;
点菜*点菜;
对于(val=1;val<14;val++){
对于(coul=1;coul<5;coul++){
carte=(carte*)malloc(1*sizeof(carte));
carte->valeur=val;
点菜->couleur=coul;
courant->carte=carte;
如果(val!=13 | | coul!=4){
courant->suivant=(Noeud*)malloc(1*sizeof(Noeud));
courant=courant->suivant;
}
}
}
courant->suivant=premier;
Noeud*测试=卓越理财;
int i;
int j;
点菜*点菜;
int随机;
国际期刊;
int nbreCartes[NBREJOUERS];
对于(JouerU=0;JouerSuivant->carte;
courant->suivant=courant->suivant->suivant;
int indice=nbreCartes[jouer]++;
点菜[jouer][indice]=*点菜;
Jouer++;
如果(jouer>=nbrejouers)jouer=0;
}
消息mes;

对于(i=0;i您从未测试过任何动态分配…堆栈破坏意味着您的代码试图执行一些缓冲区溢出。问题不在这个distributionCarte函数中。在那之后,您正在调用哪个函数?这很奇怪。gdb欺骗了我。之后的函数可以工作(并且它不使用它)你从未测试过你的任何动态分配…堆栈崩溃意味着你的代码试图做一些缓冲区溢出。问题不在这个distributionCarte函数中。在那之后你调用哪个函数?这很奇怪。gdb骗了我。之后的函数可以工作(而且它不使用它)
 .... // 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 ?? ()