Я попытался реализовать модель клиент-сервер с использованием именованного канала. Теперь, когда клиент отправляет на сервер только одно сообщение, сервер может определить, какое сообщение было отправлено, и распечатать его. Теперь, если клиент отправляет несколько сообщений на один и тот же сервер, сервер не может различать сообщения и распечатывает оба клиентских сообщения вместе, а не отдельно распечатывать оба сообщения. Это код, который я использую:
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 байтов за раз. Он переходит в бесконечный цикл, почему он не блокируется после того, как он прочитал все сообщения, отправленные клиентом.