| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1103 人关注过本帖
标题:IPC中用FIFO进行客户与服务器传送文件的问题
只看楼主 加入收藏
花脸
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:9
帖 子:788
专家分:907
注 册:2017-1-4
结帖率:95.37%
收藏
 问题点数:0 回复次数:1 
IPC中用FIFO进行客户与服务器传送文件的问题
//client.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#include "unpipc.h"
#include "my_err.h"

#define SERV_FIFO "/work/test/test.serv"

int main()
{
    char fifoname[MAXLINE],buff[MAXLINE];
   
    //read pathname
    fgets(fifoname,MAXLINE,stdin);
    size_t len=strlen(fifoname);
    fifoname[len-1]='\0';
   
    //create FIFO whith pathname
    pid_t pid=getpid();
    sprintf(fifoname,"%s:%ld",fifoname,pid);
    if((mkfifo(fifoname,FILE_MODE)<0)&&(errno!=EEXIST))
      err_sys("can't create %s",fifoname);
   
    //open FIFO to server and write pathname to FIFO
    int writefifo=open(SERV_FIFO,O_WRONLY,0);
    write(writefifo,fifoname,len);

    //now open our FIFO;blocks until server opens for writing
    int readfifo=open(fifoname,O_RDONLY,0);

    //read from IPC,write to standard output
    ssize_t n;
    while((n=read(readfifo,buff,MAXLINE))>0)
      write(STDOUT_FILENO,buff,n);

    close(readfifo);
    unlink(fifoname);
    exit(0);
}

//server.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include "my_err.h"
#include "unpipc.h"

#define SERV_FIFO "/work/test/test.serv"

int main()
{
    char *ptr=NULL,buff[MAXLINE+1],fifoname[MAXLINE];

    if((mkfifo(SERV_FIFO,FILE_MODE)<0)&&(errno!=EEXIST))
      err_sys("can't create %s",SERV_FIFO);

    //open sever's well-know FIFO reading and write
    int readfifo=open(SERV_FIFO,O_RDONLY,0);
    int dummyfd=open(SERV_FIFO,O_WRONLY,0);

    //read pathname from IPC(is from client pathname) to fifoname
    ssize_t n;
    if((n=read(readfifo,fifoname,MAXLINE))==0)
        err_quit("end of file while reading pathname");
    if((ptr=strchr(fifoname,':'))==NULL)
    {
        err_msg("bogus resquest: %s",fifoname);
    }
    *ptr++=0;
    //open write text to pathname(fifoname)
    int writefd=open(fifoname,O_WRONLY,0);
   
    //write text(from SERV_FIFO) to pathname(fifoname)
    int fd;
    if((fd=open(ptr,O_RDONLY))<0)
    {
        int len=strlen(fifoname);
        write(writefd,fifoname,len);
        close(writefd);
    }
    else
    {
        while((n=read(fd,buff,MAXLINE))>0)
            write(writefd,buff,n);

        close(fd);
        close(writefd);
    }
    exit(0);   
}
代码描述:
用一个众所周知的路径名创建一个服务器FIFO,然后客户机上用客户输入的路径名+pid创建一个客户FIFO,
客户把想要读取文件的路径名通过服务器的FIFO传送给服务器,服务器找到文件传送给客户,输出到屏幕上。

问题,屏幕上总是不显示文件内容
图片附件: 游客没有浏览图片的权限,请 登录注册
搜索更多相关主题的帖子: 客户 include int open write 
2018-07-25 11:04
花脸
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:9
帖 子:788
专家分:907
注 册:2017-1-4
收藏
得分:0 
图片附件: 游客没有浏览图片的权限,请 登录注册

调试的结果是在open打开要读的文件这阻塞。。。
我已经在后台启动了server,管道里应该有内容,但是打开读是为什么还会阻塞。。。。
2018-07-25 11:10
快速回复:IPC中用FIFO进行客户与服务器传送文件的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015638 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved