【问题标题】:Array of buffer always changing values缓冲区数组总是改变值
【发布时间】:2020-05-05 23:12:32
【问题描述】:

我有这段代码用于验证数组缓冲区中的内容,但我总是在数组上获得不同的值,并且它使我的程序在它不是 supose 时也得到 56(ascii 上的 8),有人可以帮忙吗?

这会为要在文件 1 上读取的套接字发送一个缓冲区:

          void send_stream(char buff[], int sockfdes)
        {
            if (write(sockfdes, buff, strlen(buff) + 1) == -1) {
        perror("ERROR: envia_stream: simulador");
                    }    
         }

        void prepare_message(int tipo, int id)
           { 
          char buff[3];

         buff[1] = id;

       switch (tipo)
     {
     case CRIACAO_P:
     buff[0] = '1';
     //buff[2] = tempo; //HORA
     send_stream(buff, sockfd);
     break;
      }

此文件 2 从套接字读取并放入缓冲区:

  char buffer[5];    
   while(1) 
    {

        read(novosockfd, buffer, sizeof(buffer));

                if (buffer[0] == '8')//FIM
        {
                     printf("Buffer[0]: %d \n", buffer[0]);
                     printf("Buffer[1]: %d \n", buffer[1]);
                     printf("Buffer[2]: %d \n", buffer[2]);
                     printf("Buffer[3]: %d \n", buffer[3]);
                     printf("Buffer[4]: %d \n", buffer[4]); 


            printf("\nSimulação terminou\n");
            break;
        }

       }
         }

【问题讨论】:

    标签: arrays buffer


    【解决方案1】:

    首先你应该告诉我们你从哪里读取,如果你是从一个套接字读取,尝试实现一个服务器或者你是从一个本地套接字读取?

    此外,您还应该检查返回类型,如下所示:

        if ( (read(novosockfd, buffer, sizeof(buffer)) <= 0 ) {
          perror("error in read");
        } else 
        {
          //code to run if the read did not failed;
        }
    

    请注意,要使 perror 起作用,您必须#include

    perror 会自动在 "" 中打印消息,然后在控制台中打印错误描述。在你做完这一切之后,来告诉我们更多的细节。 请注意,如果您不检查读取失败,您的代码会继续执行。

    【讨论】:

      【解决方案2】:

      根据您的更新判断,您首先写入大小为 4 字节的缓冲区并读取大小为 5 字节的缓冲区,请注意,从套接字读取会阻塞,直到在缓冲区中接收到指定大小,因此如果您向该缓冲区发送 4 个字节套接字,你不能指望能够读取 5 个字节。因此,为了能够发送消息,您应该在 preare_message() 中声明 char buff[4] 而不是 char buff[3],并且在方法 write(int fildes, const void *buf, size_t nbytes) 是 size_t 类型,所以你应该使用:write(sockfdes, buff, sizeof(char) * strlen(buffer) + 1); 而且您还将 id(int) 分配到 char 缓冲区中。

      【讨论】:

      • 所以基本上你需要在套接字中发送另一个客户端正在读取的确切字节数,例如如果您读取大小为 5 的缓冲区,则还需要写入大小为 5 的缓冲区
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-15
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      • 2013-12-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多