Именованные каналы для реализации клиент-сервер-Как сервер будет отличать два запроса от одного и того же клиента
Я попытался реализовать модель клиент-сервер, используя именованный канал. Теперь, когда клиент отправляет только одно сообщение на сервер, сервер может определить, что было отправлено, и распечатать его. Теперь, если клиент отправляет несколько сообщений на один и тот же сервер, сервер не может различить эти сообщения и печатает оба клиентских сообщения вместе, а не распечатывает оба сообщения отдельно. Это код, который я использую:
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 ответ
На уровне канала / потока нет сведений о том, что составляет сообщение протокола приложения. Однако есть два наиболее распространенных способа разграничения сообщений в потоке:
- префикс сообщения с их размером и прочитать столько байтов, или
- читать до определенной последовательности байтов (часто
\n
(символ новой строки) для текстовых протоколов).
Используйте один из этих методов для разделения сообщений в вашем потоке.