You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
380 lines
7.9 KiB
C++
380 lines
7.9 KiB
C++
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <unistd.h>
|
|
#include <termios.h>
|
|
#include <sys/types.h>
|
|
#include <sys/stat.h>
|
|
#include <fcntl.h>
|
|
#include <sys/stat.h>
|
|
#include <stdlib.h>
|
|
#include "network.h"
|
|
|
|
NetWork* nw;
|
|
NetWork* data_nw;
|
|
int list_len = 0;
|
|
char buf[256] = {};
|
|
|
|
typedef struct List
|
|
{
|
|
char filename[40];
|
|
}List;
|
|
|
|
void ex(void);
|
|
void must(void);
|
|
void ls(void);
|
|
void cd_to(char* cd);
|
|
void download(char* get);
|
|
void upload(char* put);
|
|
|
|
int main(int argc,char* argv[])
|
|
{
|
|
|
|
char c_ip[40] = {};
|
|
strcpy(c_ip,argv[1]);
|
|
|
|
nw = open_network('c',SOCK_STREAM,c_ip,21);
|
|
if(NULL == nw)
|
|
{
|
|
printf("open network socket null!\n");
|
|
return -1;
|
|
}
|
|
|
|
printf("Connected to %s.\n",c_ip);
|
|
|
|
nrecv(nw,buf,sizeof(buf));
|
|
printf("%s",buf);//220
|
|
|
|
for(;;)
|
|
{
|
|
char user[20] = {};
|
|
printf("Name (%s:zhizhen):",c_ip);
|
|
gets(user);
|
|
|
|
sprintf(buf,"USER %s\n",user);
|
|
nsend(nw,buf,strlen(buf));
|
|
|
|
bzero(buf,sizeof(buf));
|
|
nrecv(nw,buf,sizeof(buf));
|
|
printf("%s",buf);//331
|
|
|
|
char pw[20] = {};
|
|
printf("Password:");
|
|
struct termios old, new;
|
|
tcgetattr(0, &old); // 获取终端属性
|
|
new = old;
|
|
new.c_lflag &= ~(ECHO | ICANON);// 不使用标准的输出,不显示字符。
|
|
tcsetattr(0, TCSANOW, &new);// 设置终端新的属性
|
|
gets(pw);
|
|
tcsetattr(0, TCSANOW, &old);
|
|
|
|
sprintf(buf,"PASS %s\n",pw);
|
|
nsend(nw,buf,strlen(buf));//pw
|
|
|
|
bzero(buf,sizeof(buf));
|
|
nrecv(nw,buf,sizeof(buf));
|
|
printf("\n%s",buf);//230
|
|
if(strstr(buf,"530") == NULL)
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
|
|
printf("Remote system type is UNIX.\n");
|
|
printf("Using binary mode to transfer files.\n");
|
|
|
|
ex();
|
|
must();
|
|
char cmd[40] = {};
|
|
while(1)
|
|
{
|
|
|
|
printf("ftp> ");
|
|
gets(cmd);
|
|
if(strcmp(cmd,"bye")==0)
|
|
{
|
|
break;
|
|
}
|
|
if(strcmp(cmd,"ls")==0)
|
|
{
|
|
ls();
|
|
}
|
|
|
|
char *cmd1 = malloc(20);
|
|
char *path = malloc(100);
|
|
sscanf(cmd,"%s %s",cmd1,path);
|
|
if(strcmp(cmd1,"cd") == 0)
|
|
{
|
|
cd_to(path);
|
|
}
|
|
|
|
if(strcmp(cmd1,"get") == 0)
|
|
{
|
|
download(path);
|
|
}
|
|
|
|
if(strcmp(cmd1,"put") == 0)
|
|
{
|
|
upload(path);
|
|
}
|
|
|
|
//must();
|
|
}
|
|
|
|
printf("221 Goodbye.\n");//221
|
|
|
|
|
|
}
|
|
|
|
void ex(void)
|
|
{
|
|
sprintf(buf,"SYST\n");
|
|
nsend(nw,buf,strlen(buf));
|
|
|
|
bzero(buf,sizeof(buf));
|
|
nrecv(nw,buf,sizeof(buf));
|
|
//puts(buf);
|
|
|
|
sprintf(buf,"OPTS UTF8 ON\n");
|
|
nsend(nw,buf,strlen(buf));
|
|
|
|
bzero(buf,sizeof(buf));
|
|
nrecv(nw,buf,sizeof(buf));
|
|
//puts(buf);
|
|
|
|
}
|
|
|
|
void must(void)
|
|
{
|
|
sprintf(buf,"PWD\n");
|
|
nsend(nw,buf,strlen(buf));
|
|
|
|
bzero(buf,sizeof(buf));
|
|
nrecv(nw,buf,sizeof(buf));
|
|
//puts(buf);//257
|
|
|
|
sprintf(buf,"PASV\n");
|
|
nsend(nw,buf,strlen(buf));
|
|
|
|
bzero(buf,sizeof(buf));
|
|
nrecv(nw,buf,sizeof(buf));
|
|
//puts(buf);//227
|
|
|
|
unsigned char ip1,ip2,ip3,ip4,port1,port2;
|
|
sscanf(strchr(buf,'(')+1,"%hhu,%hhu,%hhu,%hhu,%hhu,%hhu",&ip1,&ip2,&ip3,&ip4,&port1,&port2);
|
|
sprintf(buf,"%hhu.%hhu.%hhu.%hhu",ip1,ip2,ip3,ip4);
|
|
|
|
|
|
NetWork* data_nw = open_network('c',SOCK_STREAM,buf,port1*256+port2);
|
|
//printf("connect success fd = %d\n",data_nw->fd);
|
|
|
|
sprintf(buf,"LIST -al\n");
|
|
nsend(nw,buf,strlen(buf));
|
|
|
|
bzero(buf,sizeof(buf));
|
|
nrecv(nw,buf,sizeof(buf));
|
|
//printf("%s",buf);//150
|
|
|
|
int ret = 0;
|
|
bzero(buf,sizeof(buf));
|
|
while(ret = nrecv(data_nw,buf,sizeof(buf)))
|
|
{
|
|
//printf("%s",buf);
|
|
bzero(buf,sizeof(buf));
|
|
}
|
|
close_network(data_nw);
|
|
|
|
bzero(buf,sizeof(buf));
|
|
nrecv(nw,buf,sizeof(buf));
|
|
//printf("%s",buf);//226
|
|
}
|
|
|
|
void ls(void)
|
|
{
|
|
sprintf(buf,"PWD\n");
|
|
nsend(nw,buf,strlen(buf));
|
|
|
|
bzero(buf,sizeof(buf));
|
|
nrecv(nw,buf,sizeof(buf));
|
|
//puts(buf);//257
|
|
|
|
sprintf(buf,"PASV\n");
|
|
nsend(nw,buf,strlen(buf));
|
|
|
|
bzero(buf,sizeof(buf));
|
|
nrecv(nw,buf,sizeof(buf));
|
|
//puts(buf);//227
|
|
|
|
unsigned char ip1,ip2,ip3,ip4,port1,port2;
|
|
sscanf(strchr(buf,'(')+1,"%hhu,%hhu,%hhu,%hhu,%hhu,%hhu",&ip1,&ip2,&ip3,&ip4,&port1,&port2);
|
|
sprintf(buf,"%hhu.%hhu.%hhu.%hhu",ip1,ip2,ip3,ip4);
|
|
|
|
|
|
NetWork* data_nw = open_network('c',SOCK_STREAM,buf,port1*256+port2);
|
|
//printf("connect success fd = %d\n",data_nw->fd);
|
|
|
|
sprintf(buf,"LIST -al\n");
|
|
nsend(nw,buf,strlen(buf));
|
|
|
|
printf("200 PORT command successful. Consider using PASV.\n");
|
|
|
|
bzero(buf,sizeof(buf));
|
|
nrecv(nw,buf,sizeof(buf));
|
|
printf("%s",buf);//150
|
|
|
|
int ret = 0;
|
|
bzero(buf,sizeof(buf));
|
|
while(ret = nrecv(data_nw,buf,sizeof(buf)))
|
|
{
|
|
printf("%s",buf);
|
|
bzero(buf,sizeof(buf));
|
|
}
|
|
close_network(data_nw);
|
|
|
|
bzero(buf,sizeof(buf));
|
|
nrecv(nw,buf,sizeof(buf));
|
|
printf("%s",buf);//226
|
|
}
|
|
|
|
void cd_to(char* cd)
|
|
{
|
|
char *dir = cd;
|
|
if(strcmp(dir,"..")==0)
|
|
{
|
|
sprintf(buf,"CDUP %s\n",dir);
|
|
}
|
|
else
|
|
{
|
|
sprintf(buf,"CWD %s\n",dir);
|
|
}
|
|
nsend(nw,buf,strlen(buf));
|
|
|
|
bzero(buf,sizeof(buf));
|
|
nrecv(nw,buf,sizeof(buf));
|
|
printf("%s",buf);//250
|
|
}
|
|
|
|
void download(char* get)
|
|
{
|
|
char *filename = get;
|
|
sprintf(buf,"TYPE A\n");
|
|
nsend(nw,buf,strlen(buf));
|
|
|
|
bzero(buf,sizeof(buf));
|
|
nrecv(nw,buf,sizeof(buf));
|
|
puts(buf);
|
|
|
|
sprintf(buf,"SIZE %s\n",filename);
|
|
nsend(nw,buf,strlen(buf));
|
|
|
|
bzero(buf,sizeof(buf));
|
|
nrecv(nw,buf,sizeof(buf));
|
|
puts(buf);
|
|
|
|
sprintf(buf,"MDTM %s\n",filename);
|
|
nsend(nw,buf,strlen(buf));
|
|
|
|
bzero(buf,sizeof(buf));
|
|
nrecv(nw,buf,sizeof(buf));
|
|
puts(buf);
|
|
|
|
sprintf(buf,"PASV\n");
|
|
nsend(nw,buf,strlen(buf));
|
|
|
|
bzero(buf,sizeof(buf));
|
|
nrecv(nw,buf,sizeof(buf));
|
|
puts(buf);
|
|
|
|
unsigned char ip1,ip2,ip3,ip4,port1,port2;
|
|
sscanf(strchr(buf,'(')+1,"%hhu,%hhu,%hhu,%hhu,%hhu,%hhu",&ip1,&ip2,&ip3,&ip4,&port1,&port2);
|
|
sprintf(buf,"%hhu.%hhu.%hhu.%hhu",ip1,ip2,ip3,ip4);
|
|
|
|
data_nw = open_network('c',SOCK_STREAM,buf,port1*256+port2);
|
|
printf("connect success fd = %d\n",data_nw->fd);
|
|
|
|
sprintf(buf,"RETR %s\n",filename);
|
|
nsend(nw,buf,strlen(buf));
|
|
|
|
bzero(buf,sizeof(buf));
|
|
nrecv(nw,buf,sizeof(buf));
|
|
puts(buf);
|
|
|
|
int fd = open(filename,O_WRONLY|O_CREAT|O_TRUNC,0644);
|
|
if(0 > fd)
|
|
{
|
|
perror("open");
|
|
return;
|
|
}
|
|
int ret = 0;
|
|
while(ret = nrecv(data_nw,buf,sizeof(buf)))
|
|
{
|
|
write(fd,buf,ret);
|
|
}
|
|
close(fd);
|
|
}
|
|
|
|
void upload(char* put)
|
|
{
|
|
char *filename = put;
|
|
|
|
sprintf(buf,"TYPE A\n");
|
|
nsend(nw,buf,strlen(buf));
|
|
|
|
bzero(buf,sizeof(buf));
|
|
nrecv(nw,buf,sizeof(buf));
|
|
puts(buf);
|
|
|
|
sprintf(buf,"SIZE %s\n",filename);
|
|
nsend(nw,buf,strlen(buf));
|
|
|
|
bzero(buf,sizeof(buf));
|
|
nrecv(nw,buf,sizeof(buf));
|
|
puts(buf);
|
|
|
|
sprintf(buf,"PASV\n");
|
|
nsend(nw,buf,strlen(buf));
|
|
|
|
bzero(buf,sizeof(buf));
|
|
nrecv(nw,buf,sizeof(buf));
|
|
puts(buf);
|
|
|
|
unsigned char ip1,ip2,ip3,ip4,port1,port2;
|
|
sscanf(strchr(buf,'(')+1,"%hhu,%hhu,%hhu,%hhu,%hhu,%hhu",&ip1,&ip2,&ip3,&ip4,&port1,&port2);
|
|
sprintf(buf,"%hhu.%hhu.%hhu.%hhu",ip1,ip2,ip3,ip4);
|
|
|
|
data_nw = open_network('c',SOCK_STREAM,buf,port1*256+port2);
|
|
printf("connect success fd = %d\n",data_nw->fd);
|
|
|
|
sprintf(buf,"STOR %s\n",filename);
|
|
nsend(nw,buf,strlen(buf));
|
|
|
|
int fd = open(filename,O_RDONLY,0644);
|
|
if(0 > fd)
|
|
{
|
|
perror("open");
|
|
return;
|
|
}
|
|
int ret = 0;
|
|
bzero(buf,sizeof(buf));
|
|
while(read(fd,buf,1))
|
|
{
|
|
nsend(data_nw,buf,strlen(buf));
|
|
bzero(buf,sizeof(buf));
|
|
}
|
|
|
|
close_network(data_nw);
|
|
|
|
bzero(buf,sizeof(buf));
|
|
nrecv(nw,buf,sizeof(buf));
|
|
printf("%s",buf);// 150-226
|
|
|
|
sprintf(buf,"MDTM %s\n",filename);
|
|
nsend(nw,buf,strlen(buf));
|
|
|
|
|
|
bzero(buf,sizeof(buf));
|
|
nrecv(nw,buf,sizeof(buf));
|
|
puts(buf);
|
|
|
|
}
|
|
|