gpt4 book ai didi

c - 客户端服务器实现的命名管道-服务器如何区分来自同一客户端的两个请求

转载 作者:行者123 更新时间:2023-11-30 17:02:45 26 4
gpt4 key购买 nike

我尝试使用命名管道实现客户端服务器模型。现在,当客户端仅向服务器发送一条消息时,服务器能够识别发送的消息并将其打印出来。现在,如果客户端向同一服务器发送多条消息,服务器将无法区分这些消息,并将两个客户端消息一起打印出来,而不是单独打印这两个消息。这是我正在使用的代码:

  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个字节时,它会进入无限循环,为什么它在读取客户端发送的所有消息后不阻塞。

最佳答案

在管道/流级别上不知道什么构成应用程序协议(protocol)消息。然而,有两种最常见的方法来分隔流中的消息:

  • 在消息中添加消息大小前缀并读取相应字节数,或者
  • 读取直到找到特定的字节序列(对于基于文本的协议(protocol),通常为 \n(换行符))。

使用其中一种方法来分隔流中的消息。

关于c - 客户端服务器实现的命名管道-服务器如何区分来自同一客户端的两个请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36457127/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com