【FTP服务器之】客户端c语言代码

被动方式——下载文件:

#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/stat.h>
#include <fcntl.h>

#define MAXLINE 128

int open_config(char *ip)
{
	int p,i,length;
	char *port=NULL;
	FILE* fp_config;
	
	fp_config=fopen("config.txt","r");
	if(fp_config<0){
		perror("open file error");
		exit(1);
	}
	getline(&port,&length,fp_config);
	i=strlen(port);
	port[i-1]='\0';
	getline(&ip,&length,fp_config);
	i=strlen(ip);
	ip[i-1]='\0';
	p=atoi(port);
	
	return p;
}

int sock(int p)
{
	int control_sock;
	struct hostent *hp;
	struct sockaddr_in server,server_data;
	char read_buf[MAXLINE];

	memset(&server,0,sizeof(struct sockaddr_in));
	control_sock=socket(AF_INET,SOCK_STREAM,0);
	inet_pton(AF_INET,"192.168.16.144",&server.sin_addr);
	server.sin_family=AF_INET;
	server.sin_port=htons(p);
	connect(control_sock,(struct sockaddr *)&server,sizeof(server));
	bzero(&read_buf,sizeof(read_buf));
	read(control_sock,read_buf,MAXLINE);
	printf("%s\n",read_buf);
	
	return control_sock;
}

int sock1(int port_data)
{
	int data_sock;
	struct hostent *hp;
	struct sockaddr_in server,server_data;
	char read_buf[MAXLINE];

	memset(&server,0,sizeof(struct sockaddr_in));
	data_sock=socket(AF_INET,SOCK_STREAM,0);
	inet_pton(AF_INET,"192.168.16.144",&server.sin_addr);
	server.sin_family=AF_INET;
	server.sin_port=htons(port_data);	
	connect(data_sock,(struct sockaddr *)&server,sizeof(server));
	
	return data_sock;
}

int ch_port(char *read_buf)
{
	int n;
	char *token;
	char num[6][10];
	int m=0,i=0;

	n=strlen(read_buf);
	read_buf[n-2]=',';
	token=strtok(read_buf,",");
	while((token=strtok(NULL,","))!=NULL){
		strcpy(num[i],token);
		i++;
	}
	m=atoi(num[3])*256+atoi(num[4]);
	printf("port=%d\n",m);
	return m;
}

void login(int control_sock)
{
	char username[MAXLINE];
	char password[MAXLINE];
	char read_buf[MAXLINE];
	char send_buf[MAXLINE];	
	
	/*username*/
	bzero(send_buf,MAXLINE);
	bzero(read_buf,MAXLINE);
	printf("please input username: ");
	scanf("%s",username);
	sprintf(send_buf,"USER %s\r\n",username);
	write(control_sock,send_buf,strlen(send_buf));
	read(control_sock,read_buf,MAXLINE);
	printf("%s\n",read_buf);

	/*password*/
	bzero(send_buf,MAXLINE);
	bzero(read_buf,MAXLINE);
	printf("please input password: ");
	scanf("%s",password);
	sprintf(send_buf,"PASS %s\r\n",password);
	write(control_sock,send_buf,strlen(send_buf));
	read(control_sock,read_buf,MAXLINE);
	printf("%s\n",read_buf);
}

int PASV(int control_sock)
{
	char read_buf[MAXLINE];
	char send_buf[MAXLINE];
	int port_data;

	bzero(send_buf,MAXLINE);
	bzero(read_buf,MAXLINE);
	sprintf(send_buf,"PASV\r\n");
	write(control_sock,send_buf,strlen(send_buf));	
	read(control_sock,read_buf,MAXLINE);
	printf("%s\n",read_buf);
	port_data=ch_port(read_buf);
	
	return port_data;
}


void down_file(int control_sock,int data_sock)
{
	char read_buf[MAXLINE];
	char send_buf[MAXLINE];
	char filename[20];
	int fd,ret;
	char *dirname="ftp_download";
//	char *dirname="/srv/ftp/download";	/*for ubuntu*/

	bzero(send_buf,MAXLINE);
	bzero(read_buf,MAXLINE);
	sprintf(send_buf,"CWD %s\r\n",dirname);
	write(control_sock,send_buf,strlen(send_buf));
	read(control_sock,read_buf,MAXLINE);
	printf("%s\n",read_buf);

	/*SIZE filename*/
	bzero(send_buf,MAXLINE);
	bzero(read_buf,MAXLINE);
	bzero(filename,20);
	printf("please input filename: ");
	scanf("%s",filename);
	//printf("%s\n",filename);
	sprintf(send_buf,"SIZE %s\r\n",filename);
	write(control_sock,send_buf,strlen(send_buf));
	read(control_sock,read_buf,MAXLINE);
	printf("%s\n",read_buf);
		
	/*RETR filename*/	
	bzero(send_buf,MAXLINE);
	bzero(read_buf,MAXLINE);
	sprintf(send_buf,"RETR %s\r\n",filename);
	write(control_sock,send_buf,strlen(send_buf));
	read(control_sock,read_buf,MAXLINE);
	printf("%s\n",read_buf);
	
	/*client create filename and download file*/
	fd=open(filename,O_RDWR|O_TRUNC|O_CREAT,0777);
	if(fd<0){
		perror("open file error");
		exit(1);
	}
	while((ret=read(data_sock,read_buf,MAXLINE))>0){
		write(fd,read_buf,ret);
		bzero(read_buf,MAXLINE);
	}
	close(fd);

}

void quit(int control_sock,int data_sock)
{
	char read_buf[MAXLINE];
	char send_buf[MAXLINE];	
	
	/*close data_sock*/
	bzero(send_buf,MAXLINE);
	bzero(read_buf,MAXLINE);
	close(data_sock);
	read(control_sock,read_buf,MAXLINE);
	printf("%s\n",read_buf);
	
	/*QUIT\r\n*/
	bzero(send_buf,MAXLINE);
	bzero(read_buf,MAXLINE);
	sprintf(send_buf,"QUIT\r\n");
	write(control_sock,send_buf,strlen(send_buf));
	read(control_sock,read_buf,MAXLINE);
	printf("%s\n",read_buf);
}

int main(int argc,char *argv[])
{
	int control_sock,data_sock;
	struct sockaddr_in server,server_data;
	char read_buf[MAXLINE];
	char *ip=NULL;
	int p,port_data;
	char send_buf[MAXLINE];

	/*get port from config.txt*/
	p=open_config(ip);

	/*connect port*/
	control_sock=sock(p);	

	/*login ftp server*/
	login(control_sock);

	/*PASV*/
	port_data=PASV(control_sock);

	/*open a new port*/
	bzero(send_buf,MAXLINE);
	bzero(read_buf,MAXLINE);
	memset(&server,0,sizeof(struct sockaddr_in));
	data_sock=socket(AF_INET,SOCK_STREAM,0);
	inet_pton(AF_INET,"192.168.16.144",&server.sin_addr);
	server.sin_family=AF_INET;
	server.sin_port=htons(port_data);	
	connect(data_sock,(struct sockaddr *)&server,sizeof(server));

	//data_sock=sock1(port_data);

	/*downloas the file*/
	down_file(control_sock,data_sock);
	
	/*close ftp client data_sock*/
	quit(control_sock,data_sock);

	close(control_sock);


	return 0;
}

被动方式——上传文件

#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/stat.h>
#include <fcntl.h>

#define MAXLINE 128

int ch_port(char *read_buf)
{
	int n;
	char *token;
	char num[6][10];
	int m=0,i=0;

	n=strlen(read_buf);
	read_buf[n-2]=',';
	token=strtok(read_buf,",");
	while((token=strtok(NULL,","))!=NULL){
		strcpy(num[i],token);
		i++;
	}
	m=atoi(num[3])*256+atoi(num[4]);
	printf("port=%d\n",m);
	return m;
}

int main(int argc,char *argv[])
{
	int control_sock,data_sock;
	struct hostent *hp;
	struct sockaddr_in server,server_data;
	char read_buf[MAXLINE];
	char *port=NULL,*ip=NULL;
	char send_buf[MAXLINE];
	char username[MAXLINE];
	char password[MAXLINE];
	char *dirname="ftp_upload";		/*for windows*/
//	char *dirname="/srv/ftp/upload";	/*for ubuntu*/
	char *filename;
	FILE *fp_config;
	int n,p,i,port_data,length=0;
	int ret,fd;
	char m;

/*	if(argc!=2){
		perror("argc errno");
		exit(1);
	}
*/
	fp_config=fopen("config.txt","r");
	if(fp_config<0){
		perror("open file error");
		exit(1);
	}
	getline(&port,&length,fp_config);
	i=strlen(port);
	port[i-1]='\0';
	getline(&ip,&length,fp_config);
	i=strlen(ip);
	ip[i-1]='\0';
	p=atoi(port);

	memset(&server,0,sizeof(struct sockaddr_in));
	control_sock=socket(AF_INET,SOCK_STREAM,0);
	inet_pton(AF_INET,ip,&server.sin_addr);
	server.sin_family=AF_INET;
	server.sin_port=htons(p);
	connect(control_sock,(struct sockaddr *)&server,sizeof(server));
	bzero(&read_buf,sizeof(read_buf));
	read(control_sock,read_buf,MAXLINE);
	printf("%s\n",read_buf);	
	
	/*login ftp server*/
	/*input username*/
	bzero(send_buf,MAXLINE);
	bzero(read_buf,MAXLINE);
	printf("please input username: ");
	scanf("%s",username);
	sprintf(send_buf,"USER %s\r\n",username);
	write(control_sock,send_buf,strlen(send_buf));
	read(control_sock,read_buf,MAXLINE);
	printf("%s\n",read_buf);	

	/*input passwd*/
	bzero(send_buf,MAXLINE);
	bzero(read_buf,MAXLINE);
	printf("please input password: ");
	scanf("%s",password);
	sprintf(send_buf,"PASS %s\r\n",password);
	write(control_sock,send_buf,strlen(send_buf));
	read(control_sock,read_buf,MAXLINE);
	printf("%s\n",read_buf);	

	/*PASV*/
	bzero(send_buf,MAXLINE);
	bzero(read_buf,MAXLINE);
	sprintf(send_buf,"PASV\r\n");
	write(control_sock,send_buf,strlen(send_buf));	
	read(control_sock,read_buf,MAXLINE);
	printf("%s\n",read_buf);
	port_data=ch_port(read_buf);
	
	/*open a new port*/
	bzero(send_buf,MAXLINE);
	bzero(read_buf,MAXLINE);
	memset(&server,0,sizeof(struct sockaddr_in));
	data_sock=socket(AF_INET,SOCK_STREAM,0);
	inet_pton(AF_INET,ip,&server.sin_addr);
	server.sin_family=AF_INET;
	server.sin_port=htons(port_data);	
	connect(data_sock,(struct sockaddr *)&server,sizeof(server));
	sprintf(send_buf,"CWD %s\r\n",dirname);
	write(control_sock,send_buf,strlen(send_buf));
	read(control_sock,read_buf,MAXLINE);
	printf("%s\n",read_buf);
	
	/*STOR filename*/
	bzero(send_buf,MAXLINE);
	bzero(read_buf,MAXLINE);
	printf("please input filename: ");
	scanf("%s",filename);
	sprintf(send_buf,"STOR %s\r\n",filename);
	write(control_sock,send_buf,strlen(send_buf));
	read(control_sock,read_buf,MAXLINE);
	printf("%s\n",read_buf);

	/*open the file you want upload*/
	fd=open(filename,O_RDONLY);
	if(fd<0){
		perror("open file error");
		exit(1);
	}	
	bzero(send_buf,MAXLINE);
	bzero(read_buf,MAXLINE);
	while((ret=read(fd,read_buf,MAXLINE))>0){
                write(data_sock,read_buf,ret);
                bzero(read_buf,MAXLINE);
        }
        close(fd);
	
	/*close ftp client data_sock*/
        bzero(send_buf,MAXLINE);
        bzero(read_buf,MAXLINE);
        close(data_sock);
        read(control_sock,read_buf,MAXLINE);
        printf("%s\n",read_buf);

        /*QUIT\r\n*/
        bzero(send_buf,MAXLINE);
        bzero(read_buf,MAXLINE);
        sprintf(send_buf,"QUIT\r\n");
        write(control_sock,send_buf,strlen(send_buf));
        read(control_sock,read_buf,MAXLINE);
        printf("%s\n",read_buf);
        close(control_sock);
	

	return 0;
}

主动方式——下载文件

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#define MAXLINE 128
int p1=200,p2=50;

int open_config(char *ip)
{
        int p,i,length;
        char *port=NULL;
        FILE* fp_config;

        fp_config=fopen("config.txt","r");
        if(fp_config<0){
                perror("open file error");
                exit(1);
        }
        getline(&port,&length,fp_config);
        i=strlen(port);
        port[i-1]='\0';
        getline(&ip,&length,fp_config);
        i=strlen(ip);
        ip[i-1]='\0';
        p=atoi(port);

        return p;
}


int sock(int p)
{
        int control_sock;
        struct hostent *hp;
        struct sockaddr_in server,server_data;
        char read_buf[MAXLINE];
        char send_buf[MAXLINE];

        memset(&server,0,sizeof(struct sockaddr_in));
        control_sock=socket(AF_INET,SOCK_STREAM,0);
        inet_pton(AF_INET,"192.168.16.144",&server.sin_addr);
        server.sin_family=AF_INET;
        server.sin_port=htons(p);
        connect(control_sock,(struct sockaddr *)&server,sizeof(server));
        bzero(&read_buf,sizeof(read_buf));
        read(control_sock,read_buf,MAXLINE);
        printf("%s\n",read_buf);

        return control_sock;
}

void login(int control_sock)
{
        char username[MAXLINE];
        char password[MAXLINE];
        char read_buf[MAXLINE];
        char send_buf[MAXLINE];

        /*username*/
        bzero(send_buf,MAXLINE);
        bzero(read_buf,MAXLINE);
        printf("please input username: ");
        scanf("%s",username);
        sprintf(send_buf,"USER %s\r\n",username);
        write(control_sock,send_buf,strlen(send_buf));
        read(control_sock,read_buf,MAXLINE);
        printf("%s\n",read_buf);

        /*password*/
        bzero(send_buf,MAXLINE);
        bzero(read_buf,MAXLINE);
        printf("please input password: ");
        scanf("%s",password);
        sprintf(send_buf,"PASS %s\r\n",password);
        write(control_sock,send_buf,strlen(send_buf));
        read(control_sock,read_buf,MAXLINE);
        printf("%s\n",read_buf);
}
#if 0
void down_file(int control_sock)
{
	char read_buf[MAXLINE];
	char send_buf[MAXLINE];
	char *filename;
	int fd,ret;
	char *dirname="ftp_download";
//	char *dirname="/srv/ftp/download";	/*for ubuntu*/

	bzero(send_buf,MAXLINE);
	bzero(read_buf,MAXLINE);
	sprintf(send_buf,"CWD %s\r\n",dirname);
	write(control_sock,send_buf,strlen(send_buf));
	read(control_sock,read_buf,MAXLINE);
	printf("%s\n",read_buf);

	/*SIZE filename*/
	bzero(send_buf,MAXLINE);
	bzero(read_buf,MAXLINE);
	bzero(filename,20);
	printf("please input filename: ");
	scanf("%s",filename);
	//printf("%s\n",filename);
	sprintf(send_buf,"SIZE %s\r\n",filename);
	write(control_sock,send_buf,strlen(send_buf));
	read(control_sock,read_buf,MAXLINE);
	printf("%s\n",read_buf);
	
			

	/*RETR filename*/	
	bzero(send_buf,MAXLINE);
	bzero(read_buf,MAXLINE);
	sprintf(send_buf,"RETR %s\r\n",filename);
	write(control_sock,send_buf,strlen(send_buf));
	read(control_sock,read_buf,MAXLINE);
	printf("%s\n",read_buf);
	
	return filename;
}

void file(int control_sock,int data_sock,char *filename)
{	
	/*client create filename and download file*/
	fd=open(filename,O_RDWR|O_TRUNC|O_CREAT,0777);
	if(fd<0){
		perror("open file error");
		exit(1);
	}
	while((ret=read(data_sock,read_buf,MAXLINE))>0){
		write(fd,read_buf,ret);
		bzero(read_buf,MAXLINE);
	}
	close(fd);

}
#endif
void quit(int control_sock,int data_sock)
{
	char read_buf[MAXLINE];
	char send_buf[MAXLINE];	
	
	/*close data_sock*/
	bzero(send_buf,MAXLINE);
	bzero(read_buf,MAXLINE);
	close(data_sock);
	read(control_sock,read_buf,MAXLINE);
	printf("%s\n",read_buf);
	
	/*QUIT\r\n*/
	bzero(send_buf,MAXLINE);
	bzero(read_buf,MAXLINE);
	sprintf(send_buf,"QUIT\r\n");
	write(control_sock,send_buf,strlen(send_buf));
	read(control_sock,read_buf,MAXLINE);
	printf("%s\n",read_buf);
}

int main(int argc,char *argv[])
{
	
	struct sockaddr_in server,name,client_name;
	int data_sock,control_sock,server_sock;
	char read_buf[MAXLINE];
	char send_buf[MAXLINE];
	char *ip=NULL;
	int p;
	socklen_t length;
	char filename[20];
	int fd,ret;
	char *dirname="ftp_download";
	int server_port;
	
	p=open_config(ip);

	control_sock=sock(p);
	login(control_sock);	

//	sock_d();
	server_sock=socket(AF_INET,SOCK_STREAM,0);
	bzero(&name,sizeof(name));
	name.sin_family=AF_INET;
	name.sin_addr.s_addr=htons(INADDR_ANY);
	server_port=p1*256+p2;
	name.sin_port=htons(server_port);
	bind(server_sock,(struct sockaddr *)&name,sizeof(name));
	listen(server_sock,64);

	bzero(read_buf,MAXLINE);
	bzero(send_buf,MAXLINE);
	sprintf(send_buf,"PORT 192,168,16,92,%d,%d\r\n",p1,p2);
	write(control_sock,send_buf,MAXLINE);
	read(control_sock,read_buf,MAXLINE);
	printf("%s\n",read_buf);

	bzero(send_buf,MAXLINE);
	bzero(read_buf,MAXLINE);
	sprintf(send_buf,"CWD %s\r\n",dirname);
	write(control_sock,send_buf,strlen(send_buf));
	read(control_sock,read_buf,MAXLINE);
	printf("%s\n",read_buf);

	/*SIZE filename*/
	bzero(send_buf,MAXLINE);
	bzero(read_buf,MAXLINE);
	bzero(filename,20);
	printf("please input filename: ");
	scanf("%s",filename);
	//printf("%s\n",filename);
	sprintf(send_buf,"SIZE %s\r\n",filename);
	write(control_sock,send_buf,strlen(send_buf));
	read(control_sock,read_buf,MAXLINE);
	printf("%s\n",read_buf);
	
			

	/*RETR filename*/	
	bzero(send_buf,MAXLINE);
	bzero(read_buf,MAXLINE);
	sprintf(send_buf,"RETR %s\r\n",filename);
	write(control_sock,send_buf,strlen(send_buf));
	read(control_sock,read_buf,MAXLINE);
	printf("%s\n",read_buf);
	
	length=sizeof(name);
	data_sock=accept(server_sock,(struct sockaddr *)&name,&length);

	/*client create filename and download file*/
	fd=open(filename,O_RDWR|O_TRUNC|O_CREAT,0777);
	if(fd<0){
		perror("open file error");
		exit(1);
	}
	while((ret=read(data_sock,read_buf,MAXLINE))>0){
		write(fd,read_buf,ret);
		bzero(read_buf,MAXLINE);
	}
	close(fd);

	quit(control_sock,data_sock);

	close(control_sock);	
}


  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
自己写的ftp服务端程序代码,支持{"USER", do_user }, {"PASS", do_pass }, {"CWD", do_cwd }, {"XCWD", do_cwd }, {"CDUP", do_cdup }, {"REIN", do_rein },//重新初始化,此命令终止USER,重置所有参数,控制连接仍然打开,用户可以再次使用USER命令 {"QUIT", do_quit }, /*------------传输参数命令------------*/ {"PORT", do_port },//数据端口,主要向服务器发送客户数据连接的端口 //格式为PORT h1,h2,h3,h4,p1,p2,其中32位的IP地址用h1,h2,h3,h4表示,16位的TCP端口号用p1,p2表示 {"PASV", do_pasv },//此命令要求服务器数据传输进程在指定的数据端口侦听,进入被动接收请求的状态 {"TYPE", do_type },//文件类型,可指定ASCII码、EBCDIC码、Image、本地类型文件等参数 /*------------服务命令----------------*/ {"RETR", do_retr },//下载文件 {"STOR", do_stor },//上传 {"APPE", do_appe },//上传,如文件已存在,数据附加到尾部 {"REST", do_rest },//重新开始 {"RNFR", do_rnfr }, {"RNTO", do_rnto },//重命名文件或目录 {"ABOR", do_abor },//异常终止 {"DELE", do_dele },//删除文件 {"RMD", do_rmd },//删除目录 {"XRMD", do_rmd }, {"MKD", do_mkd },//新建目录 {"XMKD", do_mkd }, {"PWD", do_pwd },//打印当前目录 {"XPWD", do_pwd }, {"LIST", do_list },//列目录详细清单 {"NLST", do_nlst },//列目录短清单 {"SYST", do_syst },//获取系统信息 {"STAT", do_stat },//返回服务器状态 {"SIZE", do_size },//获得文件大小 {"HELP", do_help }, {"NOOP", do_noop }, {"SITE", do_site }, }等命令

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值