名前付きパイプを使用してクライアント サーバー モデルを実装しようとしました。これで、クライアントがサーバーにメッセージを 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 つあります。クライアントから送信されたすべてのメッセージを読み取った後にブロックしないのはなぜでしょうか。