实现的功能如下:
功能大体上都能实现,代码的规范性,程序运行后文本的的格式还有待改善,可能还有一些尚未发现的bug,等日后有空再测试修改吧(明天开始上网课了-_-||)
myftp.h
#ifndef__MYFTP_H__
#define__MYFTP_H__
#include<sys/socket.h>
#include<sys/types.h>
#include<unistd.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#defineERROR-1
#defineLS0
#defineCD1
#definePWD2
#defineGET3
#definePUT4
#defineMYLS5
#defineMYPWD6
#defineMYCD7
typedefstructMessage{
charcmd[128];
charbuf[1024];
charcontent[2048];
}Msg;
//Public=================================================================
//Changecmdtonumber
intcmd_change(Msgmsg){
if(strstr(msg.cmd,"ls")!=NULL)
returnLS;
elseif(strstr(msg.cmd,"pwd")!=NULL)
returnPWD;
elseif(strstr(msg.cmd,"cd")!=NULL)
returnCD;
elseif(strstr(msg.cmd,"get")!=NULL)
returnGET;
elseif(strstr(msg.cmd,"put")!=NULL)
returnPUT;
elseif(strstr(msg.cmd,"LS")!=NULL)
returnMYLS;
elseif(strstr(msg.cmd,"PWD")!=NULL)
returnMYPWD;
elseif(strstr(msg.cmd,"CD")!=NULL)
returnMYCD;
elseif(strlen(msg.cmd)==0){}
else{
printf("Commend:%s(%ld)iswrong!\n\n",msg.cmd,strlen(msg.cmd));
printf("-----------------------------\n\n");
returnERROR;
}
}
//-----------------------------------------------------------------------
char*Get_file_name(Msgmsg){
char*file;
file=strtok(msg.cmd,"");
file=strtok(NULL,"");
file[strlen(file)-1]='\0';
returnfile;
}
//----------------------------------------------------------------------
voidServer_write_to_client(Msgmsg,intc_fd){
char*file=Get_file_name(msg);
memset(&msg,0,sizeof(msg));
intfd=open(file,O_RDWR);
intn_read=read(fd,msg.content,2048);
if(n_read>=0){
strcpy(msg.buf,"Serverwritetoclientsuccessfully!\n");
intn_write=write(c_fd,&msg,sizeof(msg));
if(n_write>0){
printf("Sendsuccess!\n");
}
else{
perror("why");
}
}
else{
perror("Server_write_to_client");
strcpy(msg.buf,"Serverwritetoclientfailed!\n");
write(c_fd,&msg,sizeof(msg));
}
}
//----------------------------------------------------------------------
voidClient_write_to_server(char*file,intc_fd){
printf("client_file:%s\n",file);
Msgmsg;
memset(&msg,0,sizeof(msg));
intfd=open(file,O_RDWR);
intn_read=read(fd,msg.content,2048);
if(n_read>0){
printf("Clientwritetoserversuccessfully!\n");
write(c_fd,&msg,sizeof(msg));
}
else{
printf("Clientwritetoserverfailed!\n");
}
}
//------------------------------------------------------------------------
voidServer_listen_from_client(char*file,intc_fd){
Msgmsg;
memset(&msg,0,sizeof(msg));
intn_read=read(c_fd,&msg,sizeof(msg));
if(n_read>0){
intfd=open(file,O_RDWR|O_CREAT,0600);
if(fd>0){
intn_write=write(fd,msg.content,strlen(msg.content));
if(n_write>0){
strcpy(msg.buf,"Serverlistenfromclientsuccessfully!\n");
write(c_fd,&msg,sizeof(msg));
}
else{
strcpy(msg.buf,"Serverlistenfromclientfailed!\n");
write(c_fd,&msg,sizeof(msg));
}
}
else{
printf("file=%s\n",file);
perror("Servercreatefilefailed!\n\n");
}
}
else{
printf("Serverreadpipefailed\n\n");
}
}
//-----------------------------------------------------------------------
voidClient_listen_from_server(char*filename,intc_fd){
Msgmsg;
memset(&msg,0,sizeof(msg));
intn_read=read(c_fd,&msg,sizeof(msg));
if(n_read>0){
printf("Recvsuccess!\n");
printf("content:\n%s\n",msg.content);
printf("%ld:%s\n",strlen(filename),filename);
intfd=open(filename,O_RDWR|O_CREAT,0600);
if(fd>0){
intn_write=write(fd,msg.content,strlen(msg.content));
if(n_write>0){
printf("Clientlistenfromserversuccessfully!\n");
}
else{
printf("Clientlistenfromserverfailed!\n");
}
}
else{
printf("Clientlistenfromserverfailed!\n");
}
}
else{
perror("Recvfailed");
}
}
//Server=================================================================
//Server:handlecmd
voidserver_cmd_handle(intc_fd,Msgmsg,intnum){
if(num==LS){
Msgmsg;
FILE*fp=popen("ls","r");
memset(&msg,0,sizeof(msg));
intn_read=fread(msg.buf,1,2048,fp);
if(n_read<=0){
perror("Server_read");
}
else{
write(c_fd,&msg,sizeof(msg));
}
}
elseif(num==PWD){
Msgmsg;
FILE*fp=popen("pwd","r");
memset(&msg,0,sizeof(msg));
intn_read=fread(msg.buf,1,2048,fp);
if(n_read<=0){
perror("Server_read");
}
else{
write(c_fd,&msg,sizeof(msg));
}
}
elseif(num==CD){
//1.getfilename
char*file=Get_file_name(msg);
//2.getallfile'snamewhichisintheserver
FILE*fp=popen("ls","r");
char*Rbuf=(char*)malloc(2048*sizeof(char));
memset(Rbuf,0,2048);
fread(Rbuf,1,2048,fp);
fclose(fp);
//3.checkifitexiits
if(strstr(file,"..")!=NULL||strstr(Rbuf,file)!=NULL){
intret=chdir(file);
if(ret==0){
char*buf="Success!\n";
write(c_fd,buf,strlen(buf));
}
else{
perror("Server_CD_chdir");
exit(-1);
}
}
else{
char*buf="Fileisnotexist!";
write(c_fd,buf,strlen(buf));
exit(-1);
}
}
elseif(num==GET){
intn_read,n_write,fd;
//1.getfilename
char*file=Get_file_name(msg);
printf("serverwanttoget%s\n\n",file);
//2.getallfile'snamewhichisintheserver
FILE*fp=popen("ls","r");
char*Rbuf=(char*)malloc(2048*sizeof(char));
fread(Rbuf,1,2048,fp);
fclose(fp);
//3.copyandsendtxt
if(strstr(Rbuf,file)!=NULL){
Server_write_to_client(msg,c_fd);
}
}
elseif(num==PUT){
char*file=Get_file_name(msg);
printf("Clientput%s\n\n",file);
char*filename;
filename=(char*)malloc(20*sizeof(char));
strcpy(filename,file);
printf("Clientput%s\n\n",filename);
Server_listen_from_client(filename,c_fd);
}
}
//client======================================================
//Client:handlecmd
voidclient_cmd_handle(intc_fd,Msgmsg,intnum){
if(num==MYLS){
FILE*fp=popen("ls","r");
char*Rbuf=(char*)malloc(2048*sizeof(char));
memset(Rbuf,0,2048);
intRtypes=fread(Rbuf,1,2048,fp);
printf("\n%s\n------------------------------\n\n",Rbuf);
pclose(fp);
}
elseif(num==MYPWD){
FILE*fp=popen("pwd","r");
char*Rbuf=(char*)malloc(2048*sizeof(char));
memset(Rbuf,0,2048);
intRtypes=fread(Rbuf,1,2048,fp);
printf("\n%s\n------------------------------\n\n",Rbuf);
pclose(fp);
}
elseif(num==MYCD){
//1.getfilename
char*file=Get_file_name(msg);
//2.getallfile'snamewhichisintheclient
FILE*fp=popen("ls","r");
char*Rbuf=(char*)malloc(2048*sizeof(char));
memset(Rbuf,0,2048);
fread(Rbuf,1,2048,fp);
fclose(fp);
//3.checkifitexiits
if(strstr(file,"..")!=NULL||strstr(Rbuf,file)!=NULL){
intret=chdir(file);
if(ret==0){
printf("\nSuccess!\n\n------------------------------\n\n");
}else{
perror("Server_cd");
exit(-1);
}
}else{
printf("\nFileisnotexist!\n\n------------------------------\n\n");
exit(-1);
}
}
}
#endif
server.c
#include<stdio.h>
#include<stdio.h>
#include<string.h>
#include"myftp.h"
#include<sys/types.h>/*SeeNOTES*/
#include<sys/socket.h>
#include
#include<netinet/in.h>
#include<unistd.h>
#include<sys/stat.h>
#include<fcntl.h>
intmain(intargc,char**argv){
ints_fd,c_fd,ret,c_len,fd,key;
Msgmsg;
structsockaddr_ins_addr;
structsockaddr_inc_addr;
memset(&s_addr,0,sizeof(structsockaddr_in));
memset(&c_addr,0,sizeof(structsockaddr_in));
if(argc!=2){
printf("Paramwrong!\n");
exit(-1);
}
//=============================================================================connext
//socket
s_fd=socket(AF_INET,SOCK_STREAM,0);
if(s_fd==-1){
perror("Server_socket");
exit(-2);
}
//bind
s_addr.sin_family=AF_INET;
s_addr.sin_port=htons(atoi(argv[1]));
inet_aton("192.168.95.130",&s_addr.sin_addr);
ret=bind(s_fd,(structsockaddr*)&s_addr,sizeof(structsockaddr_in));
if(ret==-1){
perror("Server_bind");
exit(-3);
}
//listen
listen(s_fd,10);
//accept
c_len=sizeof(structsockaddr_in);
c_fd=accept(s_fd,(structsockaddr*)&c_addr,&c_len);
if(c_fd==-1){
perror("Server_accept");
exit(-4);
}else{
printf("-------------------------------------\n\n");
printf("%sconnected\n\n",inet_ntoa(c_addr.sin_addr));
printf("-------------------------------------\n\n");
}
//=============================================================================work
//while{
while(1){
memset(&msg,0,sizeof(msg));
intn_read=read(c_fd,&msg,sizeof(msg));
printf("read:%s\n",msg.cmd);
//handlekey
key=cmd_change(msg);
server_cmd_handle(c_fd,msg,key);
}
return0;
}
client.c
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"myftp.h"
#include<sys/types.h>/*SeeNOTES*/
#include<sys/socket.h>
#include
#include<netinet/in.h>
#include<unistd.h>
#include<fcntl.h>
intmain(intarc,char**argv){
intc_fd,fd,key;
Msgmsg;
char*file=NULL;
structsockaddr_inc_addr;
memset(&c_addr,0,sizeof(structsockaddr_in));
if(arc!=3){
printf("Paramwrong!\n");
exit(-1);
}
//=================================================================================================connect
//socket
c_fd=socket(AF_INET,SOCK_STREAM,0);
if(c_fd==-1){
perror("Client_socket");
exit(-2);
}
//connect
c_addr.sin_family=AF_INET;
c_addr.sin_port=htons(atoi(argv[2]));
inet_aton(argv[1],&c_addr.sin_addr);
intret=connect(c_fd,(structsockaddr*)&c_addr,sizeof(structsockaddr_in));
if(ret==-1){
perror("Client_connect");
exit(-3);
}else{
printf("-------------------------------------\n\n");
printf("Connectedsuccessfully!\n\n");
printf("-------------------------------------\n\n");
}
//==================================================================================================work
//while(){
while(1){
fd=fork();
//sendmsg
if(fd==0){
while(1){
printf(">");
memset(&msg,0,sizeof(msg));
fgets(msg.cmd,128,stdin);
key=cmd_change(msg);
if(key==CD||key==GET||key==PUT||key==MYCD){
char*filename=Get_file_name(msg);
file=(char*)malloc(20*sizeof(char));
strcpy(file,filename);
}
if(key<5&&key>=0){
intn_write=write(c_fd,&msg,sizeof(msg));
if(key==PUT){
Client_write_to_server(file,c_fd);
}
elseif(key==GET){
Client_listen_from_server(file,c_fd);
}
}
elseif(key>=5){
client_cmd_handle(c_fd,msg,key);
}
else
continue;
}
}
while(1){
//recvmsg
memset(msg.buf,0,strlen(msg.buf));
intn_read=read(c_fd,&msg,sizeof(msg));
printf("\n%s\n",msg.buf);
printf("-------------------------------------\n\n");
}
}
return0;
}
原文链接:https://blog.csdn.net/ChrisKevin0221/article/details/114228726