2017-09-08 7 views
2

Es ist das erste Mal, dass ich hier eine Frage mache, also hoffe ich, keine Fehler zu machen ... Ich mache einen Server-Client-Programm und ich habe diesen Fehler, wenn ich Client ausführen, habe ich "Core Dump Error".Linux C Programmierung

Ich denke, ich weiß, wo ist der Fehler, aber ich weiß nicht, wie man es löst. Ich habe 2 structs:

typedef struct { 
    int pid; 
    int cmd; //1 -login,2-registrar,3-tecla 
    char login[100]; 
    char pw[100]; 
    int tecla; 
} PEDIDO; 

typedef struct { 
    int cmd; 
    int res; 
    BONECO *b; 
} RESPOSTA; 

-Code, wenn der Server Daten an den Client über eine Named Pipe sendet:

int main(int argc, char *argv[], char *envp[]){ 
//... 
    i = read(fd, &p, sizeof (p)); 
        printf(">>> Li %d bytes\n", i); 
        printf("User : %s PID : %d\n", p.login, p.pid); 
        if (p.cmd == 1) { //LOGIN 

         char user_fd[100], pw_fd[100]; 
         FILE *f = fopen(argv[1], "r"); 
         if (!f) { 
          printf("Erro ao abrir ficheiro\n"); 
          exit(0); 
         } 
         while ((fscanf(f, "%s %s ", user_fd, pw_fd))) { 
          if (strcmp(p.login, user_fd) == 0 && strcmp(p.pw,pw_fd) == 0) { 
           printf("\nLOGIN CORRECTO!!!\n"); 
           for (i = 0; i < 20; i++) { 
            if (clientes[i][0] != p.pid && clientes[i][0] == -1) { 
             clientes[i][0] = p.pid; 
             break; 
            } 
           } 
           sprintf(cli_fifo, "ccc%d", p.pid); 
           fd_resp = open(cli_fifo, O_WRONLY); 
           r.cmd = 1; 
           r.res = 1; 
           i = write(fd_resp, &r, sizeof (r)); 
           close(fd_resp); 
           fclose(f); 
           break; 
          } 

//... 

} 

Code of Client zum Empfangen von Daten vom Server:

void *recebe_msg(void *dados) { 
    int i; 
    sprintf(cli_fifo, "ccc%d", getpid()); 
    mkfifo(cli_fifo, 0600); 
    fd_resp = open(cli_fifo, O_RDWR); 
    menu(); 
    do { 
     i = read(fd_resp, &r, sizeof (r)); 
     if (ESTADO == 0) { 
      if (r.cmd == 1 && r.res == 1) { // OK 
       ESTADO = 1; 
       wclear(win); 
       mvwprintw(win, 10, 14, "Login efectuado com sucesso!"); 

       wprintw(win, "BONECO %d, %d , %d , %d ",r.b[0].num,r.b[0].humano,r.b[0].remate,r.b[0].tempo); 

       wrefresh(win); 
       sleep(3); 
       desenha_campo(); 
      } 
      if (r.cmd == 1 && r.res == 0) { // NOK 
       wclear(win); 
       mvwprintw(win, 10, 14, "Senha e/ou login incorrectos!!!"); 
       wrefresh(win); 
       sleep(3); 
       menu(); 
      } 
      if (r.cmd == 2 && r.res == 0) { 
       wclear(win); 
       mvwprintw(win, 10, 14, "Login já está em uso!"); 
       wrefresh(win); 
       sleep(3); 
       menu(); 
      } 
      if (r.cmd == 2 && r.res == 1) { 
       wclear(win); 
       mvwprintw(win, 10, 14, "Registo efectuado com sucesso!"); 
       wrefresh(win); 
       sleep(3); 
       menu(); 
      } 

      if (r.cmd == 9) { // sair 
       FIM = 1; 
      } 
     } else if (ESTADO == 1 || ESTADO == 2) { 
      wclear(win3); 
      scrollok(win3, TRUE); 
      keypad(win3, TRUE); 
      noecho(); 
      if (r.cmd == 3) { // actualizacao de jogadores 
       desenha_campo(); 
       desenha_jogadores(); 
      } else if (r.cmd == 9) { // sair 
       FIM = 1; 
      } 
     } 
    } while (!FIM); 

    close(fd_resp); 
    unlink(cli_fifo); 
    pthread_exit(0); 
} 

OBS: Ich denke, der Fehler ist auf dem 3. Feld der Struktur RESPOSTA, aber ich weiß nicht, wie man es löst

+0

Hallo! Willkommen in der SO Community! Bitte posten Sie die Definition jeder Variablen und Struktur (Sie verweisen auf die Struktur BONECO, aber nicht auf ihre Deklaration). Kompilieren Sie Ihren Code mit der Option -ggdb und führen Sie dann Ihren Code unter gdb aus. Wenn Sie einen Segmentierungsfehler haben, verwenden Sie den Befehl "bt" und posten Sie ihn hier. Viel Glück! – bukkojot

+0

typedef struct { int humano; // pid int posXant, posYant; // posicao anterior int posX, posY; // posicao destino no ecra int num; // numJog int Tempo; // vel int remate; int equipa; } BONECO; – Kelve

+0

Okay, meine Annahme stellte sich als wahr heraus, ich habe eine Antwort erstellt. Auch, was dieses Programm tun wird? – bukkojot

Antwort

1

Hier lesen Sie BONECO Struktur:

i = read(fd_resp, &r, sizeof (r)); 

Bitte beachten Sie, dass BONECO als Zeiger, nicht unbedingt DATA deklariert.

Aber hier versuchen Sie diese Daten zu lesen:

wprintw(win, "BONECO %d, %d , %d , %d ",r.b[0].num,r.b[0].humano,r.b[0].remate,r.b[0].tempo); 

Während Sie versuchen, rb zugreifen [0], Sie Segmentierungsfehler zu erhalten, wie Sie zu dereferenzieren b Zeiger versuchen, die Stelle zu ... Unbekannt Lage. Dies verursacht genau wie geplant einen Fehler.

Ich schlage vor, Ihre Struktur zu ändern:

typedef struct { 
    int cmd; 
    int res; 
    int count_of_boneco; 
    BONECO b[]; 
} RESPOSTA; 

Wenn Sie ausreichend großen Puffer zuordnen, können Sie alle Ihre Daten lesen und dann dereferenzieren an Sie es jetzt tun.

+0

Ja, es hat funktioniert, aber der Client empfängt keine Daten von "RESPOSTA.b". Es kommt leer – Kelve

+0

Korrigieren Sie Ihre Serverlogik auf das neue Strukturlayout – bukkojot