【问题标题】:Named pipes for client server implementation-How will server distinguish between two request from the same client客户端服务器实现的命名管道-服务器如何区分来自同一客户端的两个请求
【发布时间】:2016-04-06 16:34:39
【问题描述】:

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

  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 个字节时,我有一个疑问。它进入无限循环,为什么它在读取客户端发送的所有消息后不阻塞。

【问题讨论】:

  • 管道,无论是命名的还是匿名的,都是非结构化的字节流。如果您希望将传递的数据组织成更高的结构,例如一系列单独的消息,那么您必须通过某种应用程序协议来实现它。在最简单的情况下,您可以以二进制消息大小后跟指定字节数的消息的形式发送消息。自然,管道两端的进程必须在解释上达成一致才能通信成功。
  • 也许您想改用 Unix 域套接字!
  • 我知道使用套接字会使实现更容易,但现在我需要通过命名管道来实现。
  • 我尝试将服务器代码更改为:while(1) { /*fp=fopen(FIFO_FILE, "r");*/ /*fgets(readbuf,5, fp);* /数=读取(fd,readbuf,10); fprintf(stderr,"收到的字符串:%s\n", readbuf); /*fclose(fp);*/ fprintf(stderr,"完成迭代\n");睡眠(20);我认为这会使服务器在读取管道的所有内容结束时阻塞。这不会阻塞服务器,而是进入无限循环。

标签: c client-server mkfifo mknod


【解决方案1】:

在管道/流级别没有关于什么构成应用程序协议消息的知识。但是,有两种最常见的方式来分隔流中的消息:

  • 为消息加上大小前缀并读取那么多字节,或者
  • 读取直到找到特定的字节序列(对于基于文本的协议,通常是\n(换行符))。

使用其中一种方法来分隔流中的消息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-18
    • 2018-03-05
    • 2013-11-12
    • 1970-01-01
    • 2011-09-28
    • 1970-01-01
    相关资源
    最近更新 更多