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

时间:2013-08-13 15:06:05

标签: c named-pipes

我只是在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);
}

1 个答案:

答案 0 :(得分:1)

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

无法保证将FIFO作为fp线路缓冲的输出;您可以在fflush(fp)来电后添​​加fputs()

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

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

我认为你的主要问题是fflush();其他人更接近化妆品。


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

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