2016-04-06 5 views
0

名前付きパイプを使用してクライアントサーバーモデルを実装しようとしました。クライアントが1つのメッセージだけをサーバーに送信すると、サーバーは送信されたメッセージを特定して印刷することができます。クライアントが複数のメッセージを同じサーバーに送信すると、サーバーは両方のメッセージを別々に印刷するのではなく、メッセージを区別することができず、両方のクライアントメッセージを一緒に印刷します。これは私が使用していたコードです:クライアントサーバー実装用の名前付きパイプ - サーバーが同じクライアントからの2つの要求を区別する方法

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を読みしようとしていたときに、サーバ側で知りますサーバ側のバイトで一度に無限ループに入ります。私のコンセプトには何か間違っているはずです。 クライアント側から送信されたすべてのメッセージを読み込んだ後、ブロックされない理由は無限ループになります。

+0

名前付きまたは匿名のパイプは、構造化されていないバイトストリームです。データを通過するデータを別々のメッセージのシーケンスなどの上位構造に整理したい場合は、ある種のアプリケーションプロトコルを介してデータを実装する必要があります。最も簡単な方法は、バイナリメッセージサイズと指定されたバイト数のメッセージの形式でメッセージを送信することです。当然のことながら、パイプの両端のプロセスは、通信が成功するための解釈に合致しなければならない。 –

+0

代わりにUnixドメインソケットを使用したかったでしょう。 –

+0

私はsocketを使うと実装が簡単になることが分かりますが、今は名前付きパイプを通して実装する必要があります。 – Kunal

答えて

0

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

  • プレフィックスメッセージを読み、あるいはバイトの特定のシーケンスまで
  • 読み取りが発見された(しばしば\n(テキストベースのプロトコルの場合は改行記号)。

ストリーム内のメッセージを区切るには、次のいずれかの方法を使用します。

関連する問題