c ftp 文件服务器,ftp_c.c · 二源/利用TCP文件传输协议模拟与服务器的文件传输 - Gitee.com...

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include "network.h"

#include "tools.h"

char buf[256] = {};

NetWork* data_nw;

void f_type(NetWork* nw)

{

//文件类型

sprintf(buf,"TYPE I\n");

nsend(nw,buf,strlen(buf));

bzero(buf,sizeof(buf));

nrecv(nw,buf,sizeof(buf));

puts(buf);

}

void f_pwd(NetWork* nw)

{

//路径

sprintf(buf,"PWD\n");

nsend(nw,buf,strlen(buf));

bzero(buf,sizeof(buf));

nrecv(nw,buf,sizeof(buf));

puts(buf);

}

void f_stor(NetWork* nw,char* nam)

{

//上传文件

sprintf(buf,"STOR ");

strcat(buf,nam);

strcat(buf,"\n");

nsend(nw,buf,strlen(buf));

bzero(buf,sizeof(buf));

nrecv(nw,buf,sizeof(buf));

puts(buf);

}

bool f_retr(NetWork* nw,char* nam)

{

//下载文件

sprintf(buf,"RETR ");

strcat(buf,nam);

strcat(buf,"\n");

printf("buf:%s",buf);

nsend(nw,buf,strlen(buf));

bzero(buf,sizeof(buf));

nrecv(nw,buf,sizeof(buf));

puts(buf);

if(buf[0]=='5'&&buf[1]=='5'&&'0'==buf[2]) return false;

return true;

}

void f_mdtm(NetWork* nw,char* nam)

{

//文件修改时间

sprintf(buf,"MDTM ");

strcat(buf,nam);

strcat(buf,"\n");

nsend(nw,buf,strlen(buf));

bzero(buf,sizeof(buf));

nrecv(nw,buf,sizeof(buf));

puts(buf);

}

void f_mdtm2(NetWork* nw,char* nam)

{

//文件修改时间与路径

f_mdtm(nw,nam);

char time[1024] = {};

for(int i=0;i

{

time[i] = buf[i];

}

char path[1024] = {};

f_pwd(nw);

for(int i=0;i

{

path[i] = buf[i];

}

sprintf(buf,"MDTM ");

strcat(buf,time);

strcat(buf,path);

strcat(buf,nam);

strcat(buf,"\n");

printf("%s",buf);

nsend(nw,buf,strlen(buf));

bzero(buf,sizeof(buf));

nrecv(nw,buf,sizeof(buf));

puts(buf);

}

void f_size(NetWork* nw,char* nam)

{

//文件大小

sprintf(buf,"SIZE ");

strcat(buf,nam);

strcat(buf,"\n");

nsend(nw,buf,strlen(buf));

bzero(buf,sizeof(buf));

nrecv(nw,buf,sizeof(buf));

puts(buf);

}

void f_pasv(NetWork* nw)

{

//打开数据端口

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",data_nw->fd);

bzero(buf,sizeof(buf));

}

void f_cwd(NetWork* nw,char* pat)

{

f_pasv(nw);

//系统信息

sprintf(buf,"CWD ");

strcat(buf,pat);

strcat(buf,"\n");

nsend(nw,buf,strlen(buf));

bzero(buf,sizeof(buf));

nrecv(nw,buf,sizeof(buf));

puts(buf);

}

void f_syst(NetWork* nw)

{

//系统信息

sprintf(buf,"SYST\n");

nsend(nw,buf,strlen(buf));

bzero(buf,sizeof(buf));

nrecv(nw,buf,sizeof(buf));

puts(buf);

}

void f_opts(NetWork* nw)

{

//系统型号

sprintf(buf,"OPTS UTF8 ON\n");

nsend(nw,buf,strlen(buf));

bzero(buf,sizeof(buf));

nrecv(nw,buf,sizeof(buf));

puts(buf);

}

void f_list(NetWork* nw)

{

//文件列表

sprintf(buf,"LIST -al\n");

nsend(nw,buf,strlen(buf));

printf("buf:%s\n",buf);

bzero(buf,sizeof(buf));

nrecv(nw,buf,sizeof(buf));

puts(buf);

int ret = 0;

bzero(buf,sizeof(buf));

while(ret = nrecv(data_nw,buf,sizeof(buf)))

{

for(int i=0; i

{

printf("%c",buf[i]);

}

}

printf("\n");

bzero(buf,sizeof(buf));

nrecv(nw,buf,sizeof(buf));

puts(buf);

close_network(data_nw);

}

int main(int argc,char* argv[])

{

if(argc != 2)

{

printf("Usage: %s IP Address\n",argv[0]);

return -1;

}

if(0 != strcmp(argv[1],"192.168.43.201"))

{

printf("IP Address Error!\n");

return -1;

}

if(0 !=strcmp("./ftp",argv[0]))

{

printf("Invalid command!\n");

return -1;

}

char user[20] = {};

char pass[10] = {};

printf("Connected to %s.\n",argv[1]);

NetWork* nw = open_network('c',SOCK_STREAM,argv[1],21);//连接IP

if(NULL == nw)

{

printf("open network return null!\n");

return -1;

}

nrecv(nw,buf,sizeof(buf));

puts(buf);

printf("Name (%s:zhizhen):",argv[1]);

scanf("%s",user);

clear_stdin();

sprintf(buf,"USER %s\n",user);

nsend(nw,buf,strlen(buf));

bzero(buf,sizeof(buf));

nrecv(nw,buf,sizeof(buf));

puts(buf);

printf("Password:");

get_passwd(pass,true,10);

sprintf(buf,"PASS %s\n",pass);

nsend(nw,buf,strlen(buf));

bzero(buf,sizeof(buf));

nrecv(nw,buf,sizeof(buf));

puts(buf);

if(0 != strncmp("230",buf,3))

{

printf("Login failed.\n");

return 0;

}

//打开数据端口

f_pasv(nw);

//显示文件目录

f_list(nw);

char cmd[10] = {};

char pat[20] = {};

while(true)

{

printf("ftp>");

scanf("%s",cmd);

if(0 == strcmp("bye",cmd))

{

printf("221 Goodbye.\n");

break;

}

if(0 == strcmp("cd",cmd))

{

scanf("%s",pat);

f_cwd(nw,pat);

f_pwd(nw);

f_pasv(nw);

f_list(nw);

}

if(0 == strcmp("ls",cmd))

{

f_pasv(nw);

f_list(nw);

}

if(0 == strcmp("get",cmd))//下载

{

scanf("%s",pat);

f_type(nw);

f_size(nw,pat);

f_mdtm(nw,pat);

f_pasv(nw);

if(!f_retr(nw,pat)) continue;

int fd = open(pat,O_WRONLY|O_CREAT|O_TRUNC,0644);

if(0 > fd)

{

perror("open");

return -1;

}

int ret;

while(ret = nrecv(data_nw,buf,sizeof(buf)))

{

write(fd,buf,ret);

}

close(fd);

close_network(data_nw);

bzero(buf,sizeof(buf));

nrecv(nw,buf,sizeof(buf));

puts(buf);

}

if(0 == strcmp("put",cmd))//上传

{

scanf("%s",pat);

DIR* dp = opendir(pat);

if(NULL != dp)

{

printf("open fail.\n");

continue;

}

else

{

closedir(dp);

f_size(nw,pat);

f_pasv(nw);

f_stor(nw,pat);

//获取文件大小

struct stat ato = {};

if(stat(pat,&ato))

{

perror("stat");

return -1;

}

int size = (int)ato.st_size;

//传文件

int fd = open(pat,O_RDONLY,0644);

if(0 > fd)

{

perror("open");

return -1;

}

int ret;

while(size>=256)

{

read(fd,buf,255);

nsend(data_nw,buf,strlen(buf));

size = size-255;

}

for(int i=0;i<256;i++) buf[i] = '\0';

if(size < 256)

{

read(fd,buf,size);

nsend(data_nw,buf,strlen(buf));

}

close(fd);

printf("ok\n");

}

}

}

}

一键复制

编辑

Web IDE

原始数据

按行查看

历史

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值