当前位置: 技术问答>linux和unix
UNIX网络编程下的IO 问题
来源: 互联网 发布时间:2016-05-15
本文导语: 程序是实现一个C/S模式下的文件传输,客户端先向服务器发送文件名,服务器收到后打开该文件将文件内容传给客户端 服务器核心代码如下 id_t pid; if(pipe(f) 0){ close(f[1]); ...
程序是实现一个C/S模式下的文件传输,客户端先向服务器发送文件名,服务器收到后打开该文件将文件内容传给客户端
服务器核心代码如下
id_t pid;
if(pipe(f) 0){
close(f[1]);
n=read(f[0],buf,sizeof(buf));
buf[n]='';
if(n>0)
write(fd,buf,n); //fd 是网络套接字,这条语句是将收到的文件名发给客户端,经测试成功收到子进程传来的文件名,测试文件为“filea”保存在buf里,将其发给客户端 成功接受
FILE *fp;
if((fp=fopen("filea","r"))==NULL)//问题就在这儿,如果我直接将文件名的字符串写成filea文件成功传输,但是如果我换成刚才接受的buf就不行了
write(fd,"file open error",16);
while(fgets(buf, sizeof(buf), fp))
{
buf[BUFFERSIZE]='';
cc=strlen(buf);
write(fd,buf,cc);
}
if(fp!=NULL)
fclose(fp);
close(fd);
return;
}
现在将客户端核心代码发出来:
TCPftp(const char *host, const char *service,int fd)
{
char buf[BUFFERSIZE];
char name[255];
int s, n; /* socket, read count */
pid_t pid;
s = connectTCP(host, service);
if((pid=fork())==0){//子进程从标准输入接受文件名,再发送给服务器
printf("input the file namen");
fgets(name, sizeof(name), stdin);
name[sizeof(name)]='';
write(s,name,sizeof(name));
exit(0);
}
while((n=read(s,buf,sizeof(buf)))>0)//父进程接受文件信息
{
printf("data readingn");
buf[n]='';
fputs(buf,stdout);
write(fd,buf,strlen(buf));
}
exit(0);
}
服务器核心代码如下
id_t pid;
if(pipe(f) 0){
close(f[1]);
n=read(f[0],buf,sizeof(buf));
buf[n]='';
if(n>0)
write(fd,buf,n); //fd 是网络套接字,这条语句是将收到的文件名发给客户端,经测试成功收到子进程传来的文件名,测试文件为“filea”保存在buf里,将其发给客户端 成功接受
FILE *fp;
if((fp=fopen("filea","r"))==NULL)//问题就在这儿,如果我直接将文件名的字符串写成filea文件成功传输,但是如果我换成刚才接受的buf就不行了
write(fd,"file open error",16);
while(fgets(buf, sizeof(buf), fp))
{
buf[BUFFERSIZE]='';
cc=strlen(buf);
write(fd,buf,cc);
}
if(fp!=NULL)
fclose(fp);
close(fd);
return;
}
现在将客户端核心代码发出来:
TCPftp(const char *host, const char *service,int fd)
{
char buf[BUFFERSIZE];
char name[255];
int s, n; /* socket, read count */
pid_t pid;
s = connectTCP(host, service);
if((pid=fork())==0){//子进程从标准输入接受文件名,再发送给服务器
printf("input the file namen");
fgets(name, sizeof(name), stdin);
name[sizeof(name)]='';
write(s,name,sizeof(name));
exit(0);
}
while((n=read(s,buf,sizeof(buf)))>0)//父进程接受文件信息
{
printf("data readingn");
buf[n]='';
fputs(buf,stdout);
write(fd,buf,strlen(buf));
}
exit(0);
}
|
如果所料没错的话 是客户端接收文件名输入时,文件名后多一个 换行符,你可以自己output那个文件名,看看有没有换行
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。