Массив буфера, всегда меняющий значения - PullRequest
0 голосов
/ 20 января 2020

У меня есть этот код для проверки того, что находится в буфере массива, но я всегда получаю разные значения в массиве, и это заставляет мою программу получать 56 (8 на ascii), когда ее тоже нет, может кто-нибудь помочь?

Отправляет буфер для сокета, который будет считан в файле 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;
        }

       }
         }

Ответы [ 2 ]

0 голосов
/ 20 января 2020

Судя по вашему обновлению, вы сначала пишете буфер размером 4 байта и читаете для буфера размером 5 байтов, обратите внимание, что чтение из блоков сокетов до получения указанного размера в буфере, следовательно, если вы отправите 4 байта этому сокет, вы не можете ожидать, что сможете прочитать 5 байтов. Таким образом, чтобы иметь возможность отправлять сообщение, вы должны иметь char buff [4], объявленный в preare_message () вместо char buff [3], а также параметр для размера сообщения в методе write (int fildes, const void * buf, size_t nbytes) имеет тип size_t, поэтому вы должны использовать: write (sockfdes, buff, sizeof (char) * strlen (buffer) + 1); И вы также назначаете id (int) в буфер символов.

0 голосов
/ 20 января 2020

во-первых, вы должны сообщить нам, откуда вы читаете, если вы читаете из сокета, пытаетесь внедрить сервер или вы читаете из локального сокета?

Кроме того, вы также должны проверить тип возвращаемого значения, например:

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

Обратите внимание, что для работы perror вы должны # включить

, perror автоматически выведет сообщение в "", за которым следует описание ошибки в консоли , После того, как вы все это сделаете, приходите и расскажите нам более подробную информацию. Не думайте, что если вы не проверяете ошибку чтения, ваш код продолжает выполняться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...