名前付きパイプを使用してクライアントサーバーモデルを実装しようとしました。クライアントが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を読みしようとしていたときに、サーバ側で知りますサーバ側のバイトで一度に無限ループに入ります。私のコンセプトには何か間違っているはずです。 クライアント側から送信されたすべてのメッセージを読み込んだ後、ブロックされない理由は無限ループになります。
名前付きまたは匿名のパイプは、構造化されていないバイトストリームです。データを通過するデータを別々のメッセージのシーケンスなどの上位構造に整理したい場合は、ある種のアプリケーションプロトコルを介してデータを実装する必要があります。最も簡単な方法は、バイナリメッセージサイズと指定されたバイト数のメッセージの形式でメッセージを送信することです。当然のことながら、パイプの両端のプロセスは、通信が成功するための解釈に合致しなければならない。 –
代わりにUnixドメインソケットを使用したかったでしょう。 –
私はsocketを使うと実装が簡単になることが分かりますが、今は名前付きパイプを通して実装する必要があります。 – Kunal