C 服务器和客户端 - 段错误并显示垃圾

标签 c server client

我正在编写一个连接四个服务器和客户端的游戏,我需要通过字符串将游戏数组传输到客户端。 我正在尝试使用 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);

最佳答案

(char *)gameArray[k][j]

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

2e:你确定你没有超过 playersBoard 吗?那会导致它。

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

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

关于C 服务器和客户端 - 段错误并显示垃圾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34466486/

相关文章:

c - 将文件中的 MachineCode 加载到内存中并在 C 中执行——mprotect 失败

Docker:来自守护进程的错误响应:未能在网桥上创建端点 priceless_noether:

android - 为简单的 Android 应用程序创建 Web 客户端的技术

c - 仅在线程中发生冲突时才使用互斥锁

c - 为什么 strlen 函数在此 for 循环条件下不起作用?

c - Web 服务器未收到所有请求

javascript - nw.js 在后台运行很长时间后卡住

ruby-on-rails - 如何同时以 GET 和 POST 方式传递值?

java - 在netbeans中发送的数据包不会显示在wireshark中,也不会显示在cmd->netstat中

c - 为什么 inet_ntoa 总是返回错误的 IP 地址(套接字编程公司)