Именованные каналы для реализации клиент-сервер-Как сервер будет отличать два запроса от одного и того же клиента

Я попытался реализовать модель клиент-сервер, используя именованный канал. Теперь, когда клиент отправляет только одно сообщение на сервер, сервер может определить, что было отправлено, и распечатать его. Теперь, если клиент отправляет несколько сообщений на один и тот же сервер, сервер не может различить эти сообщения и печатает оба клиентских сообщения вместе, а не распечатывает оба сообщения отдельно. Это код, который я использую:

  Server.c:
    int main(void)
    {
         FILE *fp;
        char readbuf[80];

  /*Create the FIFO if it does not exist */
  umask(0);
  mknod(FIFO_FILE, S_IFIFO|0777, 0);
  while(1)
  {
   fp=fopen(FIFO_FILE, "r");
   fgets(readbuf,80, fp);
   fprintf(stderr,"Received string: %s\n", readbuf);
   fclose(fp);
   fprintf(stderr,"Finished iteration\n");
  }

 return(0);
 }

   Client.c:
     int main()
     {
       FILE *fp;
        char * message1="message1";
        char * message2="message2";
         if((fp = fopen(FIFO_FILE, "w+")) == NULL) {
                perror("fopen");
                     exit(1);
      }

  fprintf(stderr,"Trying to transfer the first message\n");
  fputs(message1, fp);
  fprintf(stderr,"Transferred the first message\n");
  fprintf(stderr,"Trying to transfer the second message\n");
  fputs(message2, fp);
  fprintf(stderr,"Trying to transfer the second message\n");
  fclose(fp);
  return(0);
   }

Теперь я знаю, что на стороне сервера я пытаюсь прочитать 80 байтов за раз, что делает возможным считывание всех символов вместе, но всякий раз, когда я пытаюсь прочитать 5 байтов за раз на стороне сервера, он заходит в бесконечный цикл. Должно быть, что-то не так в моей концепции. У меня есть одно сомнение, когда я изменяю серверную часть для чтения 5 байтов за раз. Он входит в бесконечный цикл, почему не блокируется после того, как прочитал все сообщения, отправленные клиентом.

1 ответ

На уровне канала / потока нет сведений о том, что составляет сообщение протокола приложения. Однако есть два наиболее распространенных способа разграничения сообщений в потоке:

  • префикс сообщения с их размером и прочитать столько байтов, или
  • читать до определенной последовательности байтов (часто \n (символ новой строки) для текстовых протоколов).

Используйте один из этих методов для разделения сообщений в вашем потоке.

Другие вопросы по тегам