客户端服务器实现的命名管道 - 服务器如何区分来自同一客户端的两个请求

时间:2016-04-06 16:34:39

标签: c client-server mkfifo mknod

我尝试使用命名管道实现客户端服务器模型。现在,当客户端只向服务器发送一条消息时,服务器能够识别发送的消息并将其打印出来。现在,如果客户端向同一服务器发送多个消息,则服务器无法区分消息并将两个客户端消息一起打印出来,而不是单独打印出这两个消息。这是我正在使用的代码:

  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 个答案:

答案 0 :(得分:0)

管道/流级别不知道构成应用程序协议消息的内容。但是,有两种最常用的方法来分隔流中的消息:

  • 使用大小的前缀消息并读取许多字节,或
  • 读取直到找到某个字节序列(对于基于文本的协议,通常为\n(换行符号)。

使用其中一种方法分隔流中的邮件。