0

名前付きパイプを使用してクライアント サーバー モデルを実装しようとしました。これで、クライアントがサーバーにメッセージを 1 つだけ送信すると、サーバーは送信されたメッセージを識別して出力することができます。クライアントが複数のメッセージを同じサーバーに送信すると、サーバーはメッセージを区別できず、両方のメッセージを個別に出力する代わりに、両方のクライアント メッセージを一緒に出力します。これは私が使用しているコードです:

  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 つあります。クライアントから送信されたすべてのメッセージを読み取った後にブロックしないのはなぜでしょうか。

4

1 に答える 1

0

アプリケーション プロトコル メッセージを構成するものについて、パイプ/ストリーム レベルでの知識はありません。ただし、ストリーム内のメッセージを区切る最も一般的な方法が 2 つあります。

  • メッセージにサイズのプレフィックスを付けて、そのバイト数を読み取る、または
  • 特定のバイト シーケンスが見つかるまで読み取ります (\nテキスト ベースのプロトコルの場合は、多くの場合 (改行記号))。

これらの方法のいずれかを使用して、ストリーム内のメッセージを区切ります。

于 2016-04-06T17:12:06.663 に答える