#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) ;
}