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

📄 client.c~

📁 linux下RFC 959 FTP客户端程序
💻 C~
📖 第 1 页 / 共 2 页
字号:
#include<stdio.h>#include<sys/socket.h>#include<sys/types.h>#include<sys/fcntl.h>#include<stdlib.h>#include<string.h>#include<netdb.h>#include<errno.h>#include<arpa/inet.h>#include<sys/stat.h>#include<unistd.h> //to use read and write#include<termios.h>#include"echo.h"#define DEFAULT_PORT 21char user[64];char password[40];struct sockaddr_in ftp_server,local_host;struct hostent * server_hostent;int sock_control;int mode=1;//1--PASV 0--PORT//static struct termios stored_settings;void cmd_err_exit(char* error_message,int error_code){	printf("%s error code: %d\n",error_message,error_code);	exit(error_code);}int fill_host_addr(char *host_ip_addr,struct sockaddr_in *host,int port){	if(port<=0||port>=(1<<16))		return 254;	bzero(host,sizeof(struct sockaddr_in));//填充为0	host->sin_family=AF_INET;	host->sin_port=htons(port);	if(inet_addr(host_ip_addr)!=-1)		host->sin_addr.s_addr=inet_addr(host_ip_addr);	else	{		if((server_hostent=gethostbyname(host_ip_addr))!=0)		{			memcpy(&host->sin_addr,server_hostent->h_addr,sizeof(host->sin_addr));		}		else			return 253;	}	return 1;}int xconnect(struct sockaddr_in *s_addr,int type){	struct timeval outtime;	int set;	int s=socket(AF_INET,SOCK_STREAM,0);	if(s<0)		cmd_err_exit("Creat socket error",249);	if(type==1)	{		outtime.tv_sec=0;		outtime.tv_usec=300000;	}	else	{		outtime.tv_sec=5;		outtime.tv_usec=0;	}	set=setsockopt(s,SOL_SOCKET,SO_RCVTIMEO,&outtime,sizeof(outtime));	if(set!=0)		cmd_err_exit("set socket error",1);	//connect to the server 	if(connect(s,(struct sockaddr *)s_addr,sizeof(struct sockaddr_in))<0)	{		printf("Can't connet to the server:%s,port:%d\n",inet_ntoa(s_addr->sin_addr),ntohs(ftp_server.sin_port));		exit(252);	}	else		printf("Successfully connect to server:%s,port:%d\n",inet_ntoa(s_addr->sin_addr),ntohs(ftp_server.sin_port));	return s;}//send command to server with sock_fdint ftp_send_cmd(const char* s1,const char* s2,int sock_fd){	char send_buf[256];	int send_err,len;	if(s1)	{		strcpy(send_buf,s1);		if(s2)		{			strcat(send_buf,s2);			strcat(send_buf,"\r\n");		}		else			strcat(send_buf,"\r\n");			len=strlen(send_buf);			send_err=send(sock_fd,send_buf,len,0);	}			//在socket上发送数据		//函数返回实际发送/接收的字节数,返回-1 表示出错,需要关闭此连接。		//函数缺省是阻塞函数,直到发送/接收完毕或出错		//注意:如果 send 函数返回值与参数 len 不相等,则剩余的未发送信息需要再次发送		if(send_err<0)			printf("send error\n");		return send_err;}//get the server's reply message for sock_fdint ftp_get_reply(int sock_fd){	static int reply_code=0,count=0;	char rcv_buff[512];	count=read(sock_fd,rcv_buff,510);	if(count>0)		reply_code=atoi(rcv_buff);	else		return 0;	while(1)	{		if (count<=0)			break;		rcv_buff[count]='\0';		printf("%s",rcv_buff);		count=read(sock_fd,rcv_buff,510);	}	return reply_code;}int get_port(){	char port_respond[512];	char *temp;	int count,port_num;	ftp_send_cmd("PASV",NULL,sock_control);//进入被动模式	count=read(sock_control,port_respond,510);	if(count<=0)		return 0;	port_respond[count]='\0';	if(atoi(port_respond)==227)//确定进入被动模式	{		temp=strrchr(port_respond,',');//在串中指定字符的最后一个出现位置以找出n6		port_num=atoi(temp+1);		*temp='\0';                   //截断n6来取n5;		temp=strrchr(port_respond,',');		port_num+=atoi(temp+1)*256;		return port_num;	}	return 0;}int rand_local_port(){	int port;	srand((unsigned)time(NULL));	port = rand() % 40000 + 1025;	return port;}int xconnect_ftpdata(){	if(mode)	{		int data_port = get_port();		if(data_port != 0)			ftp_server.sin_port=htons(data_port);		return(xconnect(&ftp_server, 0));	}	else	{		int client_port, get_sock, opt, set;		char cmd_buf[32];		struct timeval outtime;		struct sockaddr_in local;		char local_ip[24];		char *ip_1, *ip_2, *ip_3, *ip_4;		int addr_len =  sizeof(struct sockaddr);		client_port = rand_local_port();		get_sock = socket(AF_INET, SOCK_STREAM, 0);		if(get_sock < 0)		{			cmd_err_exit("socket()", 1);		}		//set outtime for the data socket		outtime.tv_sec = 7;		outtime.tv_usec = 0;		opt = SO_REUSEADDR;		set = setsockopt(get_sock, SOL_SOCKET,SO_RCVTIMEO, \				&outtime,sizeof(outtime));		if(set !=0)		{			printf("set socket %s errno:%d\n",strerror(errno),errno);			cmd_err_exit("set socket", 1);		}		set = setsockopt(get_sock, SOL_SOCKET,SO_REUSEADDR, \				&opt,sizeof(opt));		if(set !=0)		{			printf("set socket %s errno:%d\n",strerror(errno),errno);			cmd_err_exit("set socket", 1);		}		bzero(&local_host,sizeof(local_host));		local_host.sin_family = AF_INET;		local_host.sin_port = htons(client_port);		local_host.sin_addr.s_addr = htonl(INADDR_ANY);		bzero(&local, sizeof(struct sockaddr));		while(1)		{			set = bind(get_sock, (struct sockaddr *)&local_host, \					sizeof(local_host));			if(set != 0 && errno == 11)			{				client_port = rand_local_port();				continue;			}			set = listen(get_sock, 1);			if(set != 0 && errno == 11)			{				cmd_err_exit("listen()", 1);			}			//get local host's ip			if(getsockname(sock_control,(struct sockaddr*)&local,\                               (socklen_t *)&addr_len) < 0)				return -1;			snprintf(local_ip, sizeof(local_ip), inet_ntoa(local.sin_addr));			//change the format to the PORT command needs.			local_ip[strlen(local_ip)]='\0';			ip_1 = local_ip;			ip_2 = strchr(local_ip, '.');			*ip_2 = '\0';			ip_2++;			ip_3 = strchr(ip_2, '.');			*ip_3 = '\0';			ip_3++;			ip_4 = strchr(ip_3, '.');			*ip_4 = '\0';			ip_4++;			snprintf(cmd_buf, sizeof(cmd_buf), "PORT %s,%s,%s,%s,%d,%d", \			ip_1, ip_2, ip_3, ip_4,	client_port >> 8, client_port&0xff);			ftp_send_cmd(cmd_buf, NULL, sock_control);			if(ftp_get_reply(sock_control) != 200)			{				printf("Can not use PORT mode!Please use \"mode\" change to PASV mode.\n");				return -1;			}			else				return get_sock;		}	}}void get_user(){	char buf[64];	printf("User:(Press Enter for anonymous):");	fgets(buf,sizeof(buf),stdin);	if(buf[0]=='\n')		strncpy(user,"anonymous",9);	else		strncpy(user,buf,strlen(buf)-1);	printf("int get_user();user:%s\n",user);}void get_pass(){	char buf[40];	printf("Password:(Press Enter for anonymous):");	echo_off();	fgets(buf,sizeof(buf),stdin);	if(buf[0]=='\n')		strncpy(password,"anonymous",9);	else		strncpy(password,buf,strlen(buf)-1);	echo_on();	printf("\n");}int ftp_login(){	int err;	get_user();	if(ftp_send_cmd("USER ", user, sock_control) < 0)		cmd_err_exit("Can not send message",1);;	err = ftp_get_reply(sock_control);	if(err == 331)	{		get_pass();//		printf("Ppppppppppppppp%s\n",password);		if(ftp_send_cmd("PASS ", password, sock_control) <= 0)			cmd_err_exit("Can not send message",1);		else			err = ftp_get_reply(sock_control);		if(err != 230)		{			printf("Password error!\n");			return 0;		}		return 1;	}	else	{		printf("User error!\n");		return 0;	}}void ftp_bye(){	ftp_send_cmd("QUIT",NULL,sock_control);	ftp_get_reply(sock_control);	close(sock_control);}int ftp_usr_cmd(char * cmd){	if(strncmp(cmd,"ls",2)==0)		return 1;	if(strncmp(cmd,"pwd",3)==0)		return 2;	if(strncmp(cmd,"cd",2)==0)		return 3;	if(strncmp(cmd,"put",3)==0)		return 4;	if(strncmp(cmd,"get",3)==0)		return 5;	if(strncmp(cmd,"bye",3)==0)		return 6;	if(strncmp(cmd,"mode",4)==0)		return 7;	if(strncmp(cmd,"llist",5)==0)		return 11;	if(strncmp(cmd,"!",1)==0)		return 8;	if(strncmp(cmd,"lpwd",4)==0)		return 12;	if(strncmp(cmd,"lcd",3)==0)		return 13;	else		return -1;}void ftp_list(){	int i=0,new_sock;	int set=sizeof(local_host);	int list_socket_data=xconnect_ftpdata();	if(list_socket_data<0)	{		ftp_get_reply(sock_control);		puts("creat data sock error int ftp_list()");		return;	}		ftp_get_reply(sock_control);		ftp_send_cmd("LIST",NULL,sock_control);		ftp_get_reply(sock_control);		if(mode==1)//被动模式			ftp_get_reply(list_socket_data);		else		{			while(i<3)			{				new_sock=accept(list_socket_data,(struct sockaddr*)&local_host,(socklen_t *)&set);				if(new_sock==-1)				{					printf("accept return:%s errno: %d\n",strerror(errno),errno);					i++;					continue;				}				else break;			}			if(new_sock==-1)			{				printf("Sorry you can't use PORT mode..Wrong\n");				return;			}			ftp_get_reply(new_sock);			close(new_sock);		}		close(list_socket_data);		ftp_get_reply(sock_control);}void ftp_pwd(){	ftp_send_cmd("PWD",NULL,sock_control);	ftp_get_reply(sock_control);}void local_pwd(){	char temp[512];	int size=sizeof(temp);	if(getcwd(temp,size)!=NULL)		printf("%s\n",temp);	else		printf("Can't get local dir\n");}void local_cd(char *usr_cmd){	char *cmd =strchr(usr_cmd,' ');	char dir[1024];	while(*cmd==' ')		cmd++;	if(cmd==NULL||*cmd=='\0')	{		printf("Command error\n");	}	else	{		strncpy(dir,cmd,strlen(cmd));

⌨️ 快捷键说明

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