2017-09-08 9 views
2

初めての質問ですので、間違いはありません。 私はクライアントを実行しているときにこのエラーが発生していますが、私は "core dumpedエラー"。Linux Cプログラミング

私はエラーがどこにあるのか知っていますが、解決方法はわかりません。クライアントの

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; 
          } 

//... 

} 

コードサーバからデータを受信する:

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サーバが名前付きパイプを介してクライアントにデータを送信

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; 

コード: 私は2つの構造体を持っています:私はエラーが構造体レスポスタの3番目のフィールドにあると思うが、私はそれを解決する方法を知っていません

+0

こんにちは! SOコミュニティへようこそ!すべての変数と構造体の定義を投稿してください(構造体BONECOを参照していますが、宣言は投稿していません)。また、-ggdbオプションを使用してコードをコンパイルし、gdbでコードを実行します。セグメンテーションフォルトが発生したら、コマンド "bt"を使用してここに投稿してください。がんばろう! – bukkojot

+0

typedef struct { int humano; // pid int posXant、posYant; // posicao anterior int posX、posY; // posicao destino no ecra int num; // numJog intテンポ; // vel int remate; int equipa; }ボネコ; – Kelve

+0

さて、私の仮定は真実であることが判明し、私は答えを作成しました。また、このプログラムは何をしますか? – bukkojot

答えて

1

ここでは、BONECO構造を読む:

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

はBONECOは、ポインタ、NOT実際のデータとして宣言され、注意してください。

しかし、ここでは、このデータを読み取ろう:

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

あなたはRBにアクセスしようとしますが、あなたがポイントに間接参照Bポインタ、しようとして、[0]、あなたは、セグメンテーションフォールトを取得...不明ロケーション。これは計画どおりのエラーを引き起こします。

私はあなたに構造体を変更することをお勧め:あなたは十分な大きさのバッファを割り当てる場合は、すべてのデータを読んで、あなたは今それを行うに逆参照することができます

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

+0

はい、それは機能しましたが、クライアントは "RESPOSTA.b"というデータを受け取っていません。 空になる – Kelve

+0

サーバーロジックを新しい構造レイアウトに修正しました – bukkojot

関連する問題