CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

谁有C或C++(不用MFC)的FTP客户端的例子?

楼主kkk16()2002-02-27 14:07:40 在 VC/MFC / 基础类 提问

我需要一个C或C++(不用MFC)的FTP客户端的例子。  
  比如我要下载     ftp.abc.com上的目录   mydir   下的所有文件,用户名是     aaa,密码是     bbb。该怎么写?  
  分不够再加。 问题点数:200、回复次数:9Top

1 楼ProgramWorker(软件工人)回复于 2002-02-27 14:10:04 得分 10

自己用Winsock写吧。。。  
  Top

2 楼kkk16()回复于 2002-02-27 14:21:34 得分 0

怎么写啊,我不太懂FTP协议。  
  谁能给我一个例子吗?Top

3 楼kkk16()回复于 2002-02-28 14:53:31 得分 0

没谁写过吗?Top

4 楼neccui(PPC)回复于 2002-02-28 14:57:09 得分 10

网上去找吧,程序不难,但是要写完善了则很不容易。Top

5 楼kkk16()回复于 2002-02-28 15:47:01 得分 0

其实,网上的都是用MFC写的,很容易找到。  
  但真正不用MFC写的C程序我找了几天都没找到。  
  我要的功能也不难,就是问题中说的那样。  
  如果谁能给我一个,我将会给他加分的。  
  谁能帮我?Top

6 楼Kevin_qing()回复于 2002-03-04 16:10:36 得分 170

喔哈~  
  有问题再联系我好了,呵呵Top

7 楼hello008(paladin)回复于 2002-03-04 16:36:16 得分 10

www.programsalon.com,有无数个ftp   client和server的源码  
  Top

8 楼Anoa(寂寞小野)回复于 2002-03-04 17:06:54 得分 0

用MS   internet   api   中FTP   api写蛮方便的Top

9 楼hello008(paladin)回复于 2002-03-12 11:47:03 得分 0

int   ftp_cmd(int   sd,   char   *cmd,   int   success_code)  
  {  
      int   code;  
   
      if(tcp_send(sd,   cmd,   strlen(cmd),   5)   !=(int)strlen(cmd))  
      {  
      log_msg("ftp_cmd:   tcp_send   failed");  
      return   -1;  
      }  
      if((code   =get_reply(sd))   !=success_code)  
      {  
              log_msg(cmd);  
      log_msg(g_reply);  
      return   -2;  
      }  
      return   0;  
  }  
   
  int   ftp_login(char   *hostname,   char   *user_name,   char   *passwd)  
  {  
      int   sd,   ret;  
      char   cmds[100];  
       
      if((sd   =tcp_connect(hostname,   21,   10))   <0)  
          return   -1;  
      if((ret   =get_reply(sd))   !=220)  
      {  
          closesocket(sd);  
          return   -1;  
      }  
      sprintf(cmds,   "USER   %s\r\n",   user_name);  
      if(ftp_cmd(sd,   cmds,   331)   <0)  
      {  
          closesocket(sd);  
          return   -1;  
      }  
      sprintf(cmds,   "PASS   %s\r\n",   passwd);  
      if(ftp_cmd(sd,   cmds,   230)   <0)  
      {  
          closesocket(sd);  
          return   -1;  
      }  
      sd_login   =sd;  
   
      return   sd;  
  }  
   
  int   ftp_chdir(int   sd,   char   *path)  
  {  
      char   cmds[100];  
       
      sprintf(cmds,   "CWD   %s\r\n",   path);  
      if(ftp_cmd(sd,   cmds,   250)   <0)  
      return   -1;  
      return   0;  
  }  
   
  int   ftp_get_size(int   sd,   char   *file_remote)  
  {  
      int   size   =0;  
      char   cmds[100];  
       
      sprintf(cmds,   "SIZE   %s\r\n",   file_remote);  
      if(ftp_cmd(sd,   cmds,   213)   <0)  
          return   0;  
      if(sscanf(g_reply,   "%*d   %d",   &size)   !=1)  
          return   0;  
   
      return   size;  
  }  
   
  int   ftp_get_time(int   sd,   char   *file_remote,   char   *pstime)  
  {  
      char   cmds[100];  
   
      sprintf(cmds,   "MDTM   %s\r\n",   file_remote);  
      if(ftp_cmd(sd,   cmds,   213)   <0)  
          return   -1;  
      strncpy(pstime,   &g_reply[4],   14);  
   
      return   0;  
  }  
   
  int   ftp_get_file(int   sd,   char   *file_remote,   char   *file_local,   int   file_len,   int   max_wait_time)  
  {  
      char   temp[200],   cmds[300];  
      int   len,   len_recved   =0,   ret   =0,   code;  
      char   buf[4096];  
      FILE   *fp   =NULL;  
      int   sd_data   =-1;  
       
      temp[0]   =0;  
      if(ftp_cmd(sd,   "TYPE   I\r\n",   200)   <0)  
      {  
          sprintf(temp,   "ftp_get_file:TYPE   I   failed!   sd=%d,   file_remote:%s",   sd,   file_remote);  
          ret   =-2;  
          goto   f_exit;  
      }  
   
      if(file_len   <=0)  
      if((file_len   =ftp_get_size(sd,   file_remote))   <=0)  
      {  
          sprintf(temp,   "ftp_get_file:ftp_get_size   failed!   sd   =%d,   file_remote=%s,   ret_len=%d",   sd,   file_remote,   file_len);  
          ret   =-3;  
          goto   f_exit;  
      }  
   
      if((sd_data   =initconn(sd))   <0)  
      {  
          sprintf(temp,   "ftp_get_file:initconn   failed!   sd   =%d,   file_remote:%s",   sd,   file_remote);  
          ret   =-4;  
          goto   f_exit;  
      }  
      sprintf(cmds,   "RETR   %s\r\n",   file_remote);  
      if(ftp_cmd(sd,   cmds,   150)   <0)  
      {  
          sprintf(temp,   "ftp_get_file:ftp_cmd   failed!   cmd:%s",   cmds);  
          ret   =-5;  
          goto   f_exit;  
      }  
   
      if((sd_accept   =tcp_accept(sd_data,   20))   <0)  
      {  
          sprintf(temp,   "ftp_get_file:ftp_accept   failed!   sd=%d,   sd_data=%d,   file_remote=%s",   sd,   sd_data,   file_remote);  
          ret   =-6;  
          goto   f_exit;  
      }    
   
      len_recved   =0;  
      if((fp   =fopen(file_local,   "wb"))   ==NULL)  
      {  
          sprintf(temp,   "ftp_get_file:open   file   for   write   failed!   local_file:%s",   file_local);  
          ret   =-1;  
          goto   f_exit;  
      }  
   
      while(len_recved   <   file_len)  
      {  
          if(file_len-len_recved   <sizeof(buf))   len   =file_len-len_recved;  
          else   len   =sizeof(buf);  
          if(tcp_recv(sd_accept,   buf,   len,   max_wait_time)   !=len)  
          {  
              sprintf(temp,   "ftp_get_file:tcp_recv   failed!   len_recved:%d,   file_len:%d,   file_remote:%s",   len_recved,   file_len,   file_remote);  
              ret   =-7;  
              get_reply(sd);  
              goto   f_exit;  
          }  
          if(fwrite(buf,   len,   1,   fp)   !=1)  
          {  
              sprintf(temp,   "ftp_get_file:   fwrite   failed!   len_recved:%d,   file_local:%s",   len_recved,   file_local);  
              get_reply(sd);  
              ret   =-8;  
              goto   f_exit;  
          }  
          len_recved   +=len;  
      }  
      tcp_close(sd_accept);   sd_accept   =-1;  
      ret   =len_recved;  
      if((code   =get_reply(sd))   !=226)  
      {  
          sprintf(temp,   "ftp_get_file:get_reply   failed   after   recv   success!   ret_code:%d,   reply   string:%s",   code,   g_reply);  
          goto   f_exit;  
      }  
   
  f_exit:  
      if(sd_accept   >=0)   tcp_close(sd_accept);  
      if(sd_data   >=0)   tcp_close(sd_data);  
      sd_accept   =-1;  
      sd_data   =-1;  
      if(fp)   fclose(fp);  
      if(ret   <0)  
      {  
      sprintf(temp,   "ftp_get_file   failed.   ret=%d",   ret);  
      log_msg(temp);  
      remove(file_local);  
      }  
   
      return   ret;  
  }  
   
  int   ftp_put_file(int   sd,   char   *file_local,   int   pos,   char   *file_remote,   int   max_wait_time)  
  {  
      char   cmds[300];  
      int   len,   file_len   =0,   len_sent   =0,   ret   =0,   code;  
      char   buf[4096];  
      FILE   *fp   =NULL;  
      int   sd_data;  
       
      if((fp   =fopen(file_local,   "r"))   ==NULL)  
      {  
          ret   =-1;  
          goto   f_exit;  
      }  
      fseek(fp,   0,   SEEK_END);  
      file_len   =ftell(fp)-pos;  
      if(file_len   <0)   return   -1;  
      if(file_len   ==0)   return   0;  
      fseek(fp,   pos,   SEEK_SET);  
   
      if(ftp_cmd(sd,   "TYPE   I\r\n",   200)   <0)  
      {  
          ret   =-1;  
          goto   f_exit;  
      }  
   
      if((sd_data   =initconn(sd))   <0)  
      {  
          ret   =-1;  
          goto   f_exit;  
      }  
      sprintf(cmds,   "STOR   %s\r\n",   file_remote);  
      if(ftp_cmd(sd,   cmds,   150)   <0)  
      {  
          ret   =-1;  
          goto   f_exit;  
      }  
   
      if((sd_accept   =tcp_accept(sd_data,   20))   <0)  
      {  
          ret   =-1;  
          goto   f_exit;  
      }  
       
      len_sent   =0;  
      while(len_sent   <   file_len)  
      {  
          if(file_len-len_sent   <sizeof(buf))   len   =file_len-len_sent;  
          else   len   =sizeof(buf);  
          if(fread(buf,   len,   1,   fp)   !=1)  
          {  
              get_reply(sd);  
              ret   =-1;  
              goto   f_exit;  
          }  
          if(tcp_send(sd_accept,   buf,   len,   max_wait_time)   !=len)  
          {  
              ret   =-1;  
              get_reply(sd);  
              goto   f_exit;  
          }  
          len_sent   +=len;  
      }  
      closesocket(sd_accept);   sd_accept   =-1;  
      if((code   =get_reply(sd))   !=226)  
      {  
      goto   f_exit;  
      }  
      ret   =len_sent;  
   
  f_exit:  
      if(sd_accept   >=0)   closesocket(sd_accept);  
      if(sd_data   >=0)   closesocket(sd_data);  
      sd_accept   =-1;  
      sd_data   =-1;  
      if(fp)   fclose(fp);  
      if(buf)   free(buf);  
   
      return   ret;  
  }  
   
  int   initconn(int   sd)  
  {  
      char   *p1,   *p2;  
      struct   sockaddr_in   addr1,   addr2;  
      char   temp[256];  
      int   len;  
      int   code,   sd_data=-1;  
       
      if((sd_data   =tcp_bind(NULL,   0))   <0)  
          return   -1;  
      len   =sizeof(addr1);  
      if(getsockname(sd_login,   (struct   sockaddr   *)&addr1,   &len)   <0)  
          return   -1;  
      if(getsockname(sd_data,   (struct   sockaddr   *)&addr2,   &len)   <0)  
          return   -1;  
      p1   =(char   *)&addr1.sin_addr;  
      p2   =(char   *)&addr2.sin_port;  
      sprintf(temp,   "PORT   %d,%d,%d,%d,%d,%d\r\n",   ((int)p1[0])   &0xff,   ((int)p1[1])   &0xff,   (int)p1[2]   &0xff,   (int)p1[3]&0xff,   (int)p2[0]&0xff,   (int)p2[1]&0xff);  
      if(tcp_send(sd,   temp,   strlen(temp),   10)   !=(int)strlen(temp))  
      {  
          closesocket(sd_data);  
          return   -1;  
      }  
      if((code   =get_reply(sd))   !=200)  
      {  
          closesocket(sd_data);  
          return   -1;  
      }  
      return   sd_data;  
  }  
   
  int   get_reply(int   sd)  
  {  
      int   i,   code   =0;  
   
  again:  
      i   =0;  
      memset(g_reply,   0,   sizeof(g_reply));  
      while(1)  
      {  
          if(tcp_recv(sd,   &g_reply[i],   1,   10)   <=0)  
              break;  
          if(g_reply[i]   =='\r')   g_reply[i]   ='   ';  
          if(g_reply[i]   =='\n')  
          {  
              g_reply[i]   ='   ';  
              if(sscanf(g_reply,   "%d",   &code)   !=1)  
              {  
                  return   -1;  
              }  
              else   break;  
          }  
          i++;  
      }  
      if(g_reply[3]   =='-')  
      {  
      i   =0;  
      goto   again;  
      }  
      g_code   =code;  
   
      return   code;  
  }  
   
  void   ftp_quit(int   sd)  
  {  
      ftp_cmd(sd,   "QUIT\r\n",   221);  
      closesocket(sd);  
  }  
  Top

相关问题

  • 我要一个纯C/C++FTP例子
  • 高分请教——关于《深入浅出MFC》中一个例子的问题(C++)
  • 求C# 用FTP实现断点续传的例子(最好是自己写的)
  • 哪位大虾可以提供c++的(不用MFC)windows程序的简单例子(有窗体的那种)
  • 有谁知道在哪可以找到《VIUSAL C++MFC编程实例》中的例子呢?
  • 如何创建dll,在vc中,我要使用c语言,不使用mfc?有没有例子?
  • thinging in c++上的例子
  • 求c++ DLL的例子
  • 求简单C/S例子
  • C++,MFC求助

关键词

  • c++
  • mfc
  • tcp
  • code
  • sd
  • 例子
  • ftp
  • cmds
  • fp
  • accept

得分解答快速导航

  • 帖主:kkk16
  • ProgramWorker
  • neccui
  • Kevin_qing
  • hello008

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo