找回密码
 注册
查看: 842|回复: 12

请教网络文件传输的读写编程!

[复制链接]
发表于 2004-11-10 10:36:58 | 显示全部楼层 |阅读模式
我要在服务器端接收从客户端传来的文件:
客户端程序如下(部分):
........................................
[code:1]   imgfile = argv[1];
   if ((source=open(imgfile,O_RDONLY))<0){
       perror("File open");
       exit(1);
   }

   lseek(source,0L,0);
   write(sock,imgfile,sizeof(imgfile));
   while((k=read(source,buf,sizeof(buf)))>0)
   write(sock,buf,k);
   printf(" \n Send succeeded!\n");
[/code:1]
........................................

服务器端程序如下(部分):
........................................
[code:1]
   while((k=read(sock,file,sizeof(file)) )<=0)
   if((target=open(file,O_WRONLY|O_CREAT|O_TRUNC,0644))<0) {
      perror("Open file!!");
      exit(4);
   }
   strcat(strs,file);
   strcat(strs,", waiting");
   write(1,strs,strlen(strs));
   while((k=read(sock,ret_buf,sizeof(ret_buf)))>0)
   write(target,ret_buf,k);
   printf("\n Receive succeeded\n");
   close(sock);
   close(target);
[/code:1]
运行俩程序后,客户端出现“Send succeeded!”,但服务器端出现“段错误”:
[root@echo receive]# ./sdweb_server
Binding server socket to port 8002
Accepting connections ...
段错误
[root@echo receive]#

请教高手,这两段程序该如何修改呀?!甚谢!!!

=====================================================
发表于 2004-11-10 11:07:07 | 显示全部楼层
服务端前面的部分呢?
回复

使用道具 举报

发表于 2004-11-10 14:09:51 | 显示全部楼层
wkp10251025, 你调试一下看看“段错误”是在哪行代码执行时发生的……
回复

使用道具 举报

发表于 2004-11-10 14:13:13 | 显示全部楼层
楼上的好久没换签名了
回复

使用道具 举报

 楼主| 发表于 2004-11-10 15:42:47 | 显示全部楼层
谢谢,文件传输我已经解决!!但是接收到的文件是显示在终端,而不是以filename保存下来的,也就是说在创建文件时出错了!!我现在想请教生成文件的方法!!

/*
* server.c
*/
#include <stdio.h>
#include <sys/types.h>
#include <sys/fcntl.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <errno.h>

int port = 8000;
int main(int argc, char * argv[])
{
  char c,buf[20480],file[30];
  int fromlen,source;
  int target;
  char * strs=" \n Receiving file";
  register int k,s,ns;
  struct sockaddr_in sin;

  s=socket(AF_INET,SOCK_STREAM,0);
  if(s<0){
    perror("Get SOCKET NO. !!!");
    exit(3);
  }

  bzero(&sin, sizeof(sin));
  sin.sin_family      = AF_INET;
  sin.sin_port         = htons(port);
  sin.sin_addr.s_addr  = INADDR_ANY;
  if(bind(s, (struct sockaddr *)&sin, sizeof(sin))<0){
    perror("Band SOCKET NO.!!!");
    close(s);
    exit(4);
  }
  if(listen(s,5)<0) {
    perror(" sever:listen");
    exit(5);
  }
  printf(" %s",strs);
  
while(1) {
   if((ns=accept(s, (struct sockaddr *)&sin, &fromlen))<0){
     perror(" sever:accept");
     exit(6);
   }

   while((k=read(ns,file,sizeof(file)) )<=0)
   if((target=open(file,O_WRONLY|O_CREAT|O_TRUNC,0700))<0)
        //虽然是O_CREAT,但并没生成文件
   {
      perror("Open file!!");
      exit(4);
   }

   bzero(file,sizeof(file));
   write(1,"filename:",9);  //这儿应该得到文件名,但得到的却是文件内容(见下文)

   while((k=read(ns,buf,sizeof(buf)))>0)
   write(target,buf,k);   //这句虽然是要写入文件,但并没能生成ilename的文件
   printf("\n Received succeeded\n\n");
   close(ns);
   close(target);
   }
}

运行结果:
[root@echo receive]# ./client file.c /向server传file.c文件
[root@echo receive]# ./server   //得到显示在终端上的文件内容!
   
filename:#include <stdio.h>   //这一行得到的应该是filename: file.c ,
#include <net/libftp.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>

  #define NORMAL  0
  #define ABNORMAL      1
  #define ON              1
  #define OFF             0
..........
Receiving file
Received success

敬请指教!急盼答复!!!
回复

使用道具 举报

 楼主| 发表于 2004-11-11 09:10:34 | 显示全部楼层
我急切想知道下面的代码该如何修改:
[code:1]
bzero(file,sizeof(file));
write(1,"filename:",9);   //这儿应该得到文件名,但得到的却是文件内容

while((k=read(ns,buf,sizeof(buf)))>0)
write(target,buf,k);    //这句虽然是要写入文件,但并没能生成ilename的文件
[/code:1]
还有
[code:1]
while((k=read(ns,file,sizeof(file)) )<=0)
if((target=open(file,O_WRONLY|O_CREAT|O_TRUNC,0700))<0)
[/code:1]
为什么没能创建文件呢?
回复

使用道具 举报

发表于 2004-11-12 18:51:06 | 显示全部楼层
把客户端也贴出来,我学习一下
我是新手
回复

使用道具 举报

发表于 2004-11-13 14:27:40 | 显示全部楼层
楼主在循环中不停地打开同一个文件
回复

使用道具 举报

 楼主| 发表于 2004-11-14 10:29:16 | 显示全部楼层
错误应该不是出在循环上,循环的目的是循环检测客户机的接入,以保证服务器总是处于打开的状态。我觉得错误应该是出在下列代码内:[code:1]
bzero(file,sizeof(file));
write(1,"filename:",9);   //这儿应该得到文件名,但得到的却是文件内容

while((k=read(ns,buf,sizeof(buf)))>0)
write(target,buf,k);    //这句虽然是要写入文件,但并没能生成ilename的文件

while((k=read(ns,file,sizeof(file)) )<=0)
if((target=open(file,O_WRONLY|O_CREAT|O_TRUNC,0700))<0)  [/code:1]
也就是所传文件名(file)和文件内容(buf)没有分离,所以文件内容被传给了文件名。到底怎样将文件名和内容分离呢??!   
另外我也搞不懂为什么[code:1]if((target=open(file,O_WRONLY|O_CREAT|O_TRUNC,0700))<0)  [/code:1]
没能创建文件成功????
回复

使用道具 举报

发表于 2004-11-14 14:32:17 | 显示全部楼层
建议贴出客户端,便于调试。
回复

使用道具 举报

 楼主| 发表于 2004-11-15 09:59:03 | 显示全部楼层
客户端[code:1]
/*
*client.c
*/
#include <stdio.h>
#include <sys/types.h>
#include <sys/fcntl.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/io.h>
#include <sys/stat.h>
#include <netdb.h>
#include <errno.h>
#include <string.h>

char * host_name = "127.0.0.1";
int port = 8000;
int main(int argc, char * argv[])
  {
   char buf[20480], *file;
   file =  argv[1];  

   int source;
   register int k,s;
   struct sockaddr_in sin;
   struct hostent * hp;
   printf("\n");

   if ((source=open(file,O_RDONLY))<0){
      perror("File open");
      exit(1);
   }
   printf(" \n Sending, Please wait! ");
  
   hp=gethostbyname(host_name);
   if(hp==NULL){
      perror(" Get adress failure!!!");
      exit(1);
   }
   s=socket(AF_INET, SOCK_STREAM,0);
   if(s<0){
      perror("Get SOCKET NO.!!");
      exit(2);
   }
   sin.sin_family=AF_INET;
   sin.sin_port=htons(port);
   sin.sin_addr.s_addr = htonl(INADDR_ANY);
   sin.sin_addr.s_addr = ((struct in_addr *)(hp->h_addr))->s_addr;
//   bcopy(hp->h_addr, &sin.sin_addr, hp->h_length);

   printf("\n Connecting with server!");
   if(connect(s, (void *)&sin, sizeof(sin))<0){
      perror(" Connect !!");
      exit(3);
   }

   lseek(source,0L,0);
   write(s,file,sizeof(file));
   while((k=read(source,buf,sizeof(buf)))>0)
   write(s,buf,k);
   printf(" \n Sended success!\n");
   printf(" \n Sended %d\n", strlen(buf));
   close(s);
   close(source);
   return 0;
} [/code:1]
在传输文本文件时还尚能传送内容给文件名,要是传送二进制文件,则是乱码,现在要传的恰恰又是二进制的!

敬请关注,献计献策呀!!!   

===========================================
怎么大家好象对这个问题不感兴趣,只有斑竹捧场呀?!是这个问题太容易还是太难呢?!见于sock的重要性,还请大家一块儿动脑筋吧!!
回复

使用道具 举报

发表于 2004-11-15 12:56:54 | 显示全部楼层
[code:1]
while((k=read(ns,file,sizeof(file)) )<=0)        //小于0才创建文件?
if((target=open(file,O_WRONLY|O_CREAT|O_TRUNC,0700))<0)
//虽然是O_CREAT,但并没生成文件
{
perror("Open file!!");
exit(4);
}
[/code:1]这句不对。
回复

使用道具 举报

发表于 2004-11-16 10:34:34 | 显示全部楼层
楼主的code,是在不断的循环open文件,read完全是放在open后面嘛,先open,不存在再create,然后read,read好象有点不好,我觉得用readline,比较好一点,按这个方法写一下啦!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2025-2-11 16:10 , Processed in 0.029852 second(s), 16 queries .

© 2001-2025 Discuz! Team. Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表