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


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值