我需要做一个从服务器端取客户端文件的程序,
要求尽可能的减少客户端资源的使用,目前考虑这样几种情况:
1.使用ftp,从服务器端取客户端文件,服务器端运行程序,需要在客户端运行ftp服务;
2.使用soket,客户端和服务器端都需要运行程序?
3.共享客户端目录,服务器端运行程序进行读取。请各位高手帮忙分析一下,采用哪种方法较好?是否有类似源代码可用?

解决方案 »

  1.   

    开ftp 比较麻烦
    用socket一是两边都要有程序,另外就是编程序麻烦
    共享有安全漏洞看来如果是经常传送大量的文件的话用ftp
    偶尔传送小量文件的话用socket
    局域网中用共享
    网上的代码很多,随便搜一下就行了
      

  2.   

    socket最简单,ftp最复杂但是功能却强大、稳定楼主如果这方面的源码就留下mail
      

  3.   

    同意PiggyXP(小猪◆你快乐于是我快乐) 观点。
    使用FTP可能更好点。
      

  4.   

    socket可以非常复杂,如果你要求高一点的话——网络环境不是那么理想,经常有丢包和错包情况的,甚至TCP我都见过丢包的情况。还要考虑速度,考虑对方空间够不够,考虑文件附加信息(创建时间等等)的传输等等。网上N多那种TCP传文件的源码,建议别用,都是刚学网络编程的人写出来的东西,不稳定。除非你也是自己写来玩玩的可以用。
      

  5.   

    首先感谢大家!我也是正在学习,跟大家讨论一下比一个人闷头看书强多了。
    谢谢PiggyXP,我的mail:[email protected]
      

  6.   

    局域网中的话就用共享目录方式,很快,像读写本地文件一样。
    跨网段的用FTP,MFC中有CInternet的类,用FTP很方便。
      

  7.   

    >我现在是不相信网上的代码,只是用来学习思路和原理的,还得靠自己测试.我的项目中多点自动升级用了http/ftp协议断点续传。另外在多点的服务器之间点对点传输文件也是用了同样的方式——最多用socket互相通知对方需要接收新文件,并通过加密方式告知对方“下载”地址和解密密钥和解包验证MD5。个人感觉 http/ftp 协议用来传输文件比较方便。如果自己写,偷懒的方法是用RPC(未必不安全,只是这是一个重型协议,实现简单但扩展和修改来不太方便)
      

  8.   

    >微软的系统都是默认对管理员来说,所有的硬盘都是共享的,
    >这样是不是能在不建共享目录的情况下直接进行文件传送Win2K 是这样的,基于NetBios 文件共享方式可以很简单的复制文件(直接通过URI访问,或者把目标硬盘影射为本地网络驱动器),只要验证了身份有适当的权限,你可以把文件“塞”到目标计算机的硬盘上。局域网相对来说安全级别较低一些,实际上并不限于仅仅应用于局域网。呵呵,这样的方法并不是很好——为了安全,最好经常更改较高权限的用户帐号的密码,那么是不是也要更改你的系统程序或者配置,让它们也能继续保持对目标服务器的文件读写能力?如果嫌 ftp 麻烦,用 http 方式 + 反弹访问模式来进行文件传送即可。
    比如:
    A 需要传递文件给 B
    首先,A 将文件压缩、加密、MD5摘要,发布到IIS的某个虚拟目录下(很简单的文件复制操作)
    然后 A 将下载地址、密钥、MD5验证字符串通过加密方式通知B
    之后,B 通过 http/ftp 协议访问 A 获取文件,然后经过 MD5 验证比对,解密/解压缩
    最后,B 通知 A 已完成。至于 IIS 的自动化设置也很简单,调用 ADSI 或者 WMI 接口都可以实现(可以用 vbs 脚本来做)。甚至很多安装程序生成器都支持这一功能,如 InstallShield/WiseInstaller。呵呵,至于 http/ftp 协议客户端的实现比服务器端简单多了, CInternet 已经提供了相应功能,或者找几个现成组件也不难,比如 Power 系列的组件。
      

  9.   

    谁有源代码,学习阶段,任务时间比较紧,希望能有个模版学习,能快一些
    qq:82249758
    email:[email protected]
      

  10.   

    给俺看看源码
    我也再学
    [email protected]
      

  11.   

    int RecvFile( SOCKET sock, char *file )
    {
    int ret;
    char buf[BUF_SIZE];
    DWORD len, readlen=0;
    int block = BUF_SIZE; eIOFlag flag = io_length;
    FILE *f; while(1)
    {
    if( io_length == flag )
    ret = recv( sock, (char*)&len, 4, 0 );
    else if( io_file == flag )
    ret = recv( sock, buf, block, 0 );
    else if( io_end == flag )
    break;

    if( 0 == ret )
    break;
    else if( SOCKET_ERROR == ret )
    {
    printf( "recv() failed: %d\n", WSAGetLastError() );
    break;
    } if( io_length == flag )
    {
    if( len < 10 )
    return 0;
    else
    {
    flag = io_file;
    if( 0 == (f = fopen( file, "wb+" )))
    break; if( len < BUF_SIZE )
    block = len;
    }
    }
    else if( io_file == flag )
    {
    fwrite( buf, 1, ret, f );
    readlen += ret;
    if( readlen == len )
    {
    fclose( f );
    flag = io_end;
    }
    else
    {
    block = len - readlen;
    if( block > BUF_SIZE )
    block = BUF_SIZE;
    }
    }
    }
    return 1;
    }
      

  12.   

    bool SendFile( SOCKET sock, char *filename )
    {
    FILE *f = NULL;
    eIOFlag flag = io_length;
    char buf[BUF_SIZE];
    DWORD outlen = 0; if( NULL == filename )
    return false; if( INVALID_SOCKET == sock )
    return false; if( 0 == (f = fopen( filename, "rb" )) )
    return false; while( !feof( f ) )
    {
    int count;
    count = fread( buf, 1, BUF_SIZE, f );
    outlen += count;
    } int nRet;
    nRet = send( sock, (char *)&outlen, 4, 0 ); 
    if( SOCKET_ERROR == nRet )
    {
    Error( __FILE__, __LINE__ );
    return false;
    } rewind( f );
    nRet = fread( buf, 1, BUF_SIZE, f );
    while( nRet > 0 )
    {
    nRet = send( sock, (char*)buf, nRet, 0 ); 
    if( SOCKET_ERROR == nRet )
    {
    Error( __FILE__, __LINE__ );
    return false;
    }
    nRet = fread( buf, 1, BUF_SIZE, f );
    }
    fclose( f ); return true;
    }
      

  13.   

    我们以前做了一个这样的东西,就是网络查询。在任意一台机器上,查询其他机器的数据文件。我的前辈采用了一个很简单的办法,但比较实用,就是用网络路径,在查询软件中输入远程网络路径名就ok。但这种办法只适合lan,我想如果不是什么重要的东西,这样处理最头懒
      

  14.   

    代码给你们发了FTP客户端和服务器端的代码都有^_^
      

  15.   

    FTP客户端和服务器端的代码?我也要一个,先谢了:[email protected]
      

  16.   

    可不可以也给我发一个,正需要使用,谢谢:[email protected]