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

📄 commond_action.c

📁 LINUX下开发的FTP服务器,基本实现FTP的功能.实现PORT的模式.
💻 C
📖 第 1 页 / 共 2 页
字号:
	return SCUESS;
}
int change_dir(char *valus)
{
	memset(pwd,0,500);
	getcwd(pwd,500);
	memset(commond_buffer,0,100);
	if (chdir(valus)<0)
	{
		memcpy(commond_buffer,"550 Failed to change directory.\r\n",strlen("550 Failed to change directory."));
		return FAIL;
	}
	getcwd(pwd,500);
	sprintf(commond_buffer,"250 Directory changed to %s\r\n",valus);
	return SCUESS;
}
int cdup(char *valus)
{
	chdir("..");
	memset(pwd,0,500);
	getcwd(pwd,500);
	memset(commond_buffer,0,100);
	sprintf(commond_buffer,"250 Directory changed to %s\r\n",pwd);
	return SCUESS;
}
int noop(char *valus)
{
	memset(commond_buffer,0,100);
	memcpy(commond_buffer,"200 Command okay.\r\n",strlen("200 Command okay.\r\n"));
	return SCUESS;
}
int quit(char *valus)
{
	memset(commond_buffer,0,100);
	memcpy(commond_buffer,"221 Goodbye!\r\n",strlen("221 Goodbye!\r\n"));
	return SCUESS;
}
int help(char *valus)
{
	memset(commond_buffer,0,100);
	memcpy(commond_buffer,"214- The following commands are recognized (* => unimplemented).\r\n",strlen("214- The following commands are recognized (* => unimplemented).\r\n"));
	write(client_infor.socket_control,commond_buffer,strlen(commond_buffer));
	memset(commond_buffer,0,100);
	memcpy(commond_buffer,"   USER    PORT    RETR    ALLO    DELE    SITE    XMKD    CDUP    FEAT\r\n",strlen("   USER    PORT    RETR    ALLO    DELE    SITE    XMKD    CDUP    FEAT\r\n"));
	write(client_infor.socket_control,commond_buffer,strlen(commond_buffer));
	memset(commond_buffer,0,100);
	memcpy(commond_buffer,"   PASS    PASV    STOR    REST    CWD     STAT    RMD     XCUP    OPTS\r\n",strlen("   PASS    PASV    STOR    REST    CWD     STAT    RMD     XCUP    OPTS\r\n"));
	write(client_infor.socket_control,commond_buffer,strlen(commond_buffer));
	memset(commond_buffer,0,100);
	memcpy(commond_buffer,"   ACCT    TYPE    APPE    RNFR    XCWD    HELP    XRMD    STOU    AUTH\r\n",strlen("   ACCT    TYPE    APPE    RNFR    XCWD    HELP    XRMD    STOU    AUTH\r\n"));
	write(client_infor.socket_control,commond_buffer,strlen(commond_buffer));
	memset(commond_buffer,0,100);
	memcpy(commond_buffer,"   REIN    STRU    SMNT    RNTO    LIST    NOOP    PWD     SIZE    PBSZ\r\n",strlen("   REIN    STRU    SMNT    RNTO    LIST    NOOP    PWD     SIZE    PBSZ\r\n"));
	write(client_infor.socket_control,commond_buffer,strlen(commond_buffer));
	memset(commond_buffer,0,100);
	memcpy(commond_buffer,"   QUIT    MODE    SYST    ABOR    NLST    MKD     XPWD    MDTM    PROT\r\n",strlen("   QUIT    MODE    SYST    ABOR    NLST    MKD     XPWD    MDTM    PROT\r\n"));
	write(client_infor.socket_control,commond_buffer,strlen(commond_buffer));
	memset(commond_buffer,0,100);
	memcpy(commond_buffer,"214 Direct comments or bugs to bugs@bugs.com.\r\n",strlen("214 Direct comments or bugs to bugs@bugs.com.\r\n"));
	return SCUESS;
}
int pasv_connection(char *valus)//还有问题
{
	struct sockaddr_in curr_sock,data_lisen_addr;
	int len=sizeof(struct sockaddr_in);
	char ser_ip_addr[20]={0};
	int p_f=0,p_l=0;
	pid_t ch;

	client_infor.connect_mode=PASV;
/*	memset(commond_buffer,0,100);
	sprintf(commond_buffer,"227 Entering Passive Mode (%s,0,20)\r\n",ser_ip_addr);*/
	write(client_infor.socket_control,commond_buffer,strlen(commond_buffer));
	client_infor.socket_data_listen=socket(AF_INET,SOCK_STREAM,0);
	if (client_infor.socket_data_listen<0)
	{
		perror("PASV sock error");
		return FAIL;
	}
	data_lisen_addr.sin_family=AF_INET;
	data_lisen_addr.sin_port=htons(0);
	data_lisen_addr.sin_addr.s_addr=INADDR_ANY;
	if (bind(client_infor.socket_data_listen,(struct sockaddr*)&data_lisen_addr,len)<0)
	{
		perror("PASV bind error");
		return FAIL;
	}
	if (listen(client_infor.socket_data_listen,10)<0)
	{
		perror("PASV listen error");
		return FAIL;
	}
	getsockname(client_infor.socket_data_listen,&curr_sock,&len);
	strcpy(ser_ip_addr,inet_ntoa(curr_sock.sin_addr.s_addr));
	replace_of(ser_ip_addr,'.',',');
	client_infor.port_num=ntohl(curr_sock.sin_port);
	p_f=client_infor.port_num/256;
	p_l=client_infor.port_num%256;
	return SCUESS;
}
int upload(char *valus)
{
	int fp;
	fp=open(valus,O_WRONLY|O_CREAT);
	if (fp<0)
	{
		perror("open file to upload error");
		memset(commond_buffer,0,100);
		memcpy(commond_buffer,"550 Failed to open file.\r\n",strlen("550 Failed to open file.\r\n"));
		return FAIL;
	}
	lseek(fp,client_infor.file_offset,SEEK_CUR);
	client_infor.file_offset=0;
	char buffer[500];
	memset(buffer,0,500);
	struct sockaddr_in addr;
	addr.sin_family=AF_INET;
	int len=sizeof(struct sockaddr_in);
	int count=0;
	pid_t ch;
	if (client_infor.connect_mode == PORT)
	{
		client_infor.socket_port=socket(AF_INET,SOCK_STREAM,0);
		if (client_infor.socket_port<0)
		{
			perror("create port sock error");
			memset(commond_buffer,0,100);
			memcpy(commond_buffer,"550 Failed to open file.\r\n",strlen("550 Failed to open file.\r\n"));
			return FAIL;
		}
		addr.sin_port=htons(client_infor.port_num);
		addr.sin_addr.s_addr=inet_addr(client_infor.ip_addr);
		if(connect(client_infor.socket_port,(struct sockaddr *)&addr,len)<0)
		{
			perror("connect error");
			memset(commond_buffer,0,100);
			memcpy(commond_buffer,"550 Failed to open file.\r\n",strlen("550 Failed to open file.\r\n"));
			return FAIL;
		}
		memset(commond_buffer,0,100);
		memcpy(commond_buffer,"150 Ok to send data.\r\n",strlen("150 Ok to send data.\r\n"));
		write(client_infor.socket_control,commond_buffer,strlen(commond_buffer));
		ch=fork();
		if (ch == 0)
		{
			while ((count=read(client_infor.socket_port,buffer,500))>0)
			{
				write(fp,buffer,count);
				memset(buffer,0,500);
			}
			close(fp);
			exit(0);
		}
	}
	close(fp);
	memset(commond_buffer,0,100);
	memcpy(commond_buffer,"226 File receive OK.\r\n",strlen("226 File receive OK.\r\n"));
	close(client_infor.socket_port);
	return SCUESS;
}
int download(char *valus)
{
	int fp;
	fp=open(valus,O_RDONLY);
	if (fp<0)
	{
		perror("open file to download error");
		memset(commond_buffer,0,100);
		memcpy(commond_buffer,"550 Failed to open file.\r\n",strlen("550 Failed to open file.\r\n"));
		return FAIL;
	}
	lseek(fp,client_infor.file_offset,SEEK_CUR);
	client_infor.file_offset=0;
	struct stat file;
	stat(valus,&file);
	char buffer[500];
	memset(buffer,0,500);
	struct sockaddr_in addr;
	addr.sin_family=AF_INET;
	int len=sizeof(struct sockaddr_in);
	int count=0;
	pid_t ch;
	
	if (client_infor.connect_mode == PORT)
	{
		client_infor.socket_port=socket(AF_INET,SOCK_STREAM,0);
		if (client_infor.socket_port<0)
		{
			perror("create port sock error");
			return FAIL;
		}
		addr.sin_port=htons(client_infor.port_num);
		addr.sin_addr.s_addr=inet_addr(client_infor.ip_addr);
		if(connect(client_infor.socket_port,(struct sockaddr *)&addr,len)<0)
		{
			perror("connect error");
			return FAIL;
		}
		memset(commond_buffer,0,100);
		sprintf(commond_buffer,
			"150 Opening %s mode data connection for %s (%d bytes).\r\n",
			client_infor.trans_mode == ASCII?"ASCII":"BINARY",valus,file.st_size);
		write(client_infor.socket_control,commond_buffer,strlen(commond_buffer));
		ch=fork();
		if (ch == 0)
		{
			while ((count=read(fp,buffer,500))>0)
			{
				write(client_infor.socket_port,buffer,count);
				memset(buffer,0,500);
			}
			close(fp);
			exit(0);
		}
	}
	close(fp);
	memset(commond_buffer,0,100);
	memcpy(commond_buffer,"226 Transfer complete.\r\n",strlen("226 Transfer complete.\r\n"));
	close(client_infor.socket_port);
	return SCUESS;
}
int reset_file_offset(char *valus)
{
	memset(commond_buffer,0,100);
	sprintf(commond_buffer,"350 Restarting at %s. Send STORE or RETRIEVE.\r\n",valus);
	client_infor.file_offset=atol(valus);
	return SCUESS;
}
int del_file(char *valus)
{
	memset(commond_buffer,0,100);
	if (unlink(valus)<0)
	{
		perror("Delete file error");
		return FAIL;
	}
	memcpy(commond_buffer,"250 Delete operation successful.\r\n",strlen("250 Delete operation successful.\r\n"));
	return SCUESS;
}
int ready_rename_file(char *valus)
{
	memset(client_infor.file_old_name,0,500);
	memcpy(client_infor.file_old_name,valus,strlen(valus));
	memset(commond_buffer,0,100);
	memcpy(commond_buffer,"350 Ready for RNTO.\r\n",strlen("350 Ready for RNTO.\r\n"));
	return SCUESS;
}
int rename_file(char *valus)
{
	memset(commond_buffer,0,100);
	if (rename(client_infor.file_old_name,valus)<0)
	{
		perror("rename file error");
		return FAIL;
	}	
	memcpy(commond_buffer,"250 Rename successful.\r\n",strlen("250 Rename successful.\r\n"));
	return SCUESS;
}
int make_dir(char *valus)
{
	memset(commond_buffer,0,100);
	if (mkdir(valus,0777)<0)
	{
		perror("make directory error");
		return FAIL;
	}
	memset(pwd,0,500);
	getcwd(pwd,500);
	sprintf(commond_buffer,"257 \"%s/%s\" created\r\n",pwd,valus);
	return SCUESS;
}
int remove_dir(char *valus)
{
	memset(commond_buffer,0,100);
	if (rmdir(valus)<0)
	{
		perror("remove directory error");
		return FAIL;
	}
	memset(pwd,0,500);
	getcwd(pwd,500);
	memcpy(commond_buffer,"250 Remove directory operation successful.\r\n",strlen("250 Remove directory operation successful.\r\n"));
	return SCUESS;
}
int send_file_size(char *valus)
{
	memset(commond_buffer,0,100);
	struct stat file;
	if (stat(valus,&file)<0)
	{
		memcpy(commond_buffer,"550 Could not get file size.\r\n",strlen("550 Could not get file size.\r\n"));
		return FAIL;
	}
	sprintf(commond_buffer,"213 %d\r\n",file.st_size);
	return SCUESS;
}
int append_data(char *valus)
{
	int fp;
	fp=open(valus,O_WRONLY|O_CREAT);
	if (fp<0)
	{
		perror("open file to upload error");
		memset(commond_buffer,0,100);
		memcpy(commond_buffer,"550 Failed to open file.\r\n",strlen("550 Failed to open file.\r\n"));
		return FAIL;
	}
	lseek(fp,0,SEEK_END);
	client_infor.file_offset=0;
	char buffer[500];
	memset(buffer,0,500);
	struct sockaddr_in addr;
	addr.sin_family=AF_INET;
	int len=sizeof(struct sockaddr_in);
	int count=0;
	pid_t ch;
	if (client_infor.connect_mode == PORT)
	{
		client_infor.socket_port=socket(AF_INET,SOCK_STREAM,0);
		if (client_infor.socket_port<0)
		{
			perror("create port sock error");
			memset(commond_buffer,0,100);
			memcpy(commond_buffer,"550 Failed to open file.\r\n",strlen("550 Failed to open file.\r\n"));
			return FAIL;
		}
		addr.sin_port=htons(client_infor.port_num);
		addr.sin_addr.s_addr=inet_addr(client_infor.ip_addr);
		if(connect(client_infor.socket_port,(struct sockaddr *)&addr,len)<0)
		{
			perror("connect error");
			memset(commond_buffer,0,100);
			memcpy(commond_buffer,"550 Failed to open file.\r\n",strlen("550 Failed to open file.\r\n"));
			return FAIL;
		}
		memset(commond_buffer,0,100);
		memcpy(commond_buffer,"150 Ok to send data.\r\n",strlen("150 Ok to send data.\r\n"));
		write(client_infor.socket_control,commond_buffer,strlen(commond_buffer));
		ch=fork();
		if (ch == 0)
		{
			while ((count=read(client_infor.socket_port,buffer,500))>0)
			{
				write(fp,buffer,count);
				memset(buffer,0,500);
			}
			close(fp);
			exit(0);
		}
	}
	close(fp);
	memset(commond_buffer,0,100);
	memcpy(commond_buffer,"226 File receive OK.\r\n",strlen("226 File receive OK.\r\n"));
	close(client_infor.socket_port);
	return SCUESS;
}

⌨️ 快捷键说明

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