⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ftptest.c

📁 入门程序
💻 C
字号:
#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,...)
{
	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;
	
	sockdata = socket(AF_INET,SOCK_STREAM,0);
	if (sockdata == -1) 
		goto out;
	addr.sin_family = PF_INET;
	addr.sin_port = 0;
	addr.sin_addr.s_addr = INADDR_ANY;
	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),(unsigned long*)(&tmp));	
	c = (char *)&hostip;
	p = (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),(unsigned long*)(&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) {
		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) ;
}
	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -