gpt4 book ai didi

c - 为什么 FIFO 服务器无法接收客户端的数据?使用命名管道

转载 作者:行者123 更新时间:2023-11-30 15:46:38 24 4
gpt4 key购买 nike

我刚刚在Ubuntu中做了命名管道的实验,但是服务器无法接收我在客户端输入的字符串,我该如何解决它?当我在客户端按Ctrl+C时,服务器可以接收一些字符。

服务器

#include<stdio.h>
#include<stdlib.h>
#include<sys/stat.h>
#include<unistd.h>
#include<linux/stat.h>

#define FIFO_FILE "sampleFIFO"

int main()
{
FILE *fp;
char readbuf[80];
umask(0);
mknod(FIFO_FILE,S_IFIFO|0666,0);
while(1)
{
fp = fopen(FIFO_FILE,"r");
fgets(readbuf,80,fp);
printf("Received:%s\n",readbuf);
fclose(fp);
}
return(0);
}

客户端

#include<stdio.h>
#include<stdlib.h>


#define FIFO_FILE "sampleFIFO"

int main(int argc,char *argv[])
{
FILE *fp;
char buf[80];
if((fp = fopen(FIFO_FILE,"w")) == NULL)
{
perror("error");
exit(1);
}
while(1)
{
memset(buf,0,sizeof(buf));
fgets(buf,80,stdin);
fputs(buf,fp);
}

fclose(fp);
return(0);
}

最佳答案

您的客户端代码仅在中断时才会中断循环 - 您应该测试 fgets() 的返回值,并使用它在 EOF 上中断循环。

使用 FIFO 作为输出时,不能保证 fp 是行缓冲的;您可以在 fputs() 调用之后添加 fflush(fp)

如图所示,无需使用 memset()

由于客户端不使用其命令行参数,因此其 main() 应为 int main(void)

我相信,您的主要问题是 fflush() 问题;其他的更像是装饰性的。

<小时/>

正如 Joachim Pileborg 所指出的那样,服务器并非完全没有问题。

问题中的服务器代码虽然效率低下,但可以为任意数量的客户端提供服务。但是,您确实需要嵌套循环。外循环反复打开FIFO;内部读取 FIFO 的内容。当内循环到达 EOF 时,就需要关闭流并重新打开它。同样,您需要测试 fgets() 的返回值以确保您确实读取了数据。您还应该考虑如何使服务器退出,以及服务器是否应删除它创建的 FIFO。

关于c - 为什么 FIFO 服务器无法接收客户端的数据?使用命名管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18212715/

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