【问题标题】:C Server and Client - Segmentaion fault and showing garbageC 服务器和客户端 - 分段错误并显示垃圾
【发布时间】:2015-12-25 21:16:25
【问题描述】:

我正在编写一个连接四个服务器和客户端的游戏,我需要通过字符串将游戏数组传输到客户端。 我正在尝试使用strcat 将数组收集在字符串变量playerBoard 中,但似乎当它到达客户端时,它显示垃圾,而且服务器向我显示Segmentation fault 作为错误

服务器:

 else
    {
      bzero(playersBoard, 100);
      int k, j;
      for( k = 0; k < HEIGTH; k++ )
    {
      for( j=0; j < WIDTH; j++ )
        {
          strcat(playersBoard, (char *)gameArray[k][j]);
          strcat(playersBoard, " ");
        }
    }
    strcat(playersBoard, "Now is your turn");
    printf("Players board is : \n%s\n", playersBoard);

      if(write(tdL.cl, playersBoard, 100) <= 0)
    {
      printf("[thread %d]\n", tdL.idThread);
      perror("[thread] Error at write\n");
    }
      else 
       printf("[thread %d] Message was sent with success\n", tdL.idThread);
      goto playerOneRetry;
    }

客户:

if (write (sd, message, sizeof(message)) <= 0)
{
  perror ("[client]Eroare la write() spre server.\n");
  return errno;
}

char message2[100];
  fflush(stdout);

  if (read (sd, message2, 100 ) < 0)
    {
      perror ("[client]Eroare la read() de la server.\n");
      return errno;
    }
  //writing message
  printf ("[client]Message received is : %s\n", message2);

【问题讨论】:

  • “显示垃圾”很可能是没有终止字符串的问题,这会导致未定义的行为,如果你有UB(未定义的行为)那么它不会很长一步让你崩溃。
  • 但是strcat我怎么用可以吗?
  • 这取决于gameArray[k][j] 是什么。它是什么?垃圾和崩溃问题也可能是使用某些东西作为不是指针的指针,或者通过写入数组末尾的情况。
  • 这是一个字符数组
  • 那你为什么要投呢?你能出示实际的声明吗?

标签: c server client


【解决方案1】:

(char *)gameArray[k][j]

1e : (char *)gameArray[k][j] : 为什么要强制转换? gameArray[k][j] 应该是 2 暗。类型的数组 (char *)。如果您需要进行演员表,您可能定义错误,这会导致分段。故障。

2e : 你确定你没有超越 playerBoard 吗?这会导致它。

3e : bzero(playersBoard, 100); :playersBoard的大小大概是已知的。您应该始终尽量避免使用静态 100 并将其替换为可能:sizeof(playerBoard)。

4e : 你可以防止玩家板溢出。使用 strncat 并且不要写太多。在防御性编程方面..你应该。

【讨论】:

  • 谢谢,我会试试的。最初,如果数组的元素,gnu de bugger 会调用强制转换,但我会忽略警告。
  • 如果编译器警告需要强制转换,忽略它对您没有帮助。如果 gameArray 被声明为 gameArray[][][] 你可以试试 strcat(playersBoard, &gameArray[k][j][0] )
【解决方案2】:

表达式gameArray[k][j] 是一个单个 字符,它不是字符串。您不能将其用作strcat 中的参数。尝试将字符转换为char * 会将编码字符转换为不会指向有效字符串的指针。这样使用它会导致未定义的行为

您可以将单个字符附加到字符串中,例如,

playersBoard[strlen(playersBoard)] = gameArray[k][j];
playersBoard[strlen(playersBoard) + 1] = '\0';

您应该真正关注编译器将发出的警告,如果没有强制转换,它应该会说些什么。警告通常是你在做你不应该做的事情的歌声,禁用它们通常不是一个好主意,因为它只会隐藏症状而不是问题。

还要小心转换,在大多数情况下它被认为是code smell。如果你发现你需要投射一些东西,那么你可能也做错了。

警告和强制转换的组合是最糟糕的,就像我在上面所说的那样,你只是隐藏问题,而不是解决它。

【讨论】:

    猜你喜欢
    • 2021-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多