ftp上传程序(C语言)

来源:互联网 发布:蓝铅笔网络班 编辑:程序博客网 时间:2024/05/21 17:48

#include "sys/types.h"
#include "sys/socket.h"
#include "netinet/in.h"
#include "arpa/inet.h"
#include "fcntl.h"
#include "unistd.h"
#include "stdarg.h"
#include "stdio.h"
#include "netdb.h"
int verbose = 1;
FILE *ftpio = NULL;
char buf[4096];
int ftpcmd(int sockftp,char *fmt,...)d
{
      va_list vp;
      int err,len;
      if (ftpio == NULL)
      {
        ftpio = fdopen(sockftp,"r");
        if (ftpio == NULL)
           return -1;
      }
      if (fmt)
      {
         va_start(vp,fmt);
         len = vsprintf(buf,fmt,vp);
         buf[len++] = '/r';
         buf[len++]='/n';
         write(sockftp,buf,len);
      if (verbose)
         write(1,buf,len);
      }
      do
      {
         if (fgets(buf,sizeof(buf),ftpio) == NULL)
            return -1;
        if (verbose)
           printf(buf);
      } while(buf[3] == '-');
      sscanf(buf,"%d",&err);
      return err;
}

int ftp(char *host,char *user,char *pass,char *filename,char *savefile)
{
      int sockftp = -1,sockdata = -1,sockxfer = -1;
      struct sockaddr_in addr;
      unsigned long hostip;
      int len,tmp,err;
      int retval = -1;
      int savefd;
      unsigned char *c,*p;
      struct hostent *he;
      hostip = inet_addr(host);
      if (hostip == -1)
      {
      he = gethostbyname(host);
      if (he == NULL)
      return -1;
      hostip = * (unsigned long *)he->h_addr;
   }
   sockftp = socket(AF_INET,SOCK_STREAM,0);
   if (sockftp == -1)
      goto out;
   addr.sin_family = PF_INET;
   addr.sin_port = htons(21);
   addr.sin_addr.s_addr = hostip;
   if (connect(sockftp,(struct sockaddr *)&addr,sizeof(addr)) == -1)
      goto out;
   err = ftpcmd(sockftp,NULL);
   if (err != 220)
       goto out;
       err = ftpcmd(sockftp,"USER %s",user);
   if (err != 331)
      goto out;
      err = ftpcmd(sockftp,"PASS %s",pass);
   if (err != 230)
       goto out;
      err = ftpcmd(sockftp,"TYPE I");
   if (err != 200)
       goto out;
       printf("PWD//r//n");
       err = ftpcmd(sockftp,"PWD");
      
        printf("system//r//n");
       err = ftpcmd(sockftp,"system");
      
       // printf("dir//r//n");
       err = ftpcmd(sockftp,"LS ");
      //  printf("dir//r//n");
       err = ftpcmd(sockftp,"DIR ");
   sockdata = socket(AF_INET,SOCK_STREAM,0);
   if (sockdata == -1)
      goto out;
   tmp = sizeof(addr);
   getsockname(sockftp,(struct sockaddr *)&addr,&tmp);
   addr.sin_port = 0;
   if (bind(sockdata,(struct sockaddr *)&addr,sizeof(addr)) == -1)
      goto out;
   if (listen(sockdata,1) == -1)
       goto out;
   tmp = sizeof(addr);
   getsockname(sockdata,(struct sockaddr *)&addr,&tmp);
   c = (unsigned char *)&addr.sin_addr;
   p = (unsigned char *)&addr.sin_port;
   err = ftpcmd(sockftp,"PORT %d,%d,%d,%d,%d,%d", c[0],c[1],c[2],c[3],p[0],p[1]);
   if (err != 200)
      goto out;
   err = ftpcmd(sockftp,"RETR %s",filename);
   if (err != 150)
      goto out;
   tmp = sizeof(addr);
   sockxfer = accept(sockdata,(struct sockaddr *)&addr,&tmp);
   if (sockxfer == -1)
      goto out;
   savefd = open(savefile,O_WRONLY|O_CREAT,0644);
   if (savefd == -1)
      goto out;
   retval = 0;
   while ((len=read(sockxfer,buf,sizeof(buf)))>0)
   {
   printf("开始写数据!!");
     write(savefd,buf,len);
     retval += len;
   };
   close(savefd);
   out:
   close(sockxfer);
   close(sockdata);
   close(sockftp);
   if (ftpio)
   {
   fclose(ftpio);
   ftpio = NULL;
   }
   return retval;
}
  
void main(int argc,char *argv[])
{

 if (argc<6)
 {
 printf("usgs:%s <host> <user> <passwd> <remote_name> <local_name>/n",argv[0]);
 exit(-1);
 }
 ftp(argv[1],argv[2],argv[3],argv[4],argv[5]);
 exit(0) ;
}