前言介绍:
FTP服务器(File Transfer Protocol Server)是在互联网上提供文件存储和访问服务的计算机,FTP是用来在两台计算机之间传输文件,是Internet中应用非常广泛的服务之一。它可根据实际需要设置各用户的使用权限,同时还具有跨平台的特性,即在UNIX、Linux和Windows等操作系统中都可实现FTP客户端和服务器,相互之间可跨平台进行文件的传输。因此,FTP服务是网络中经常采用的资源共享方式之一,顾名思义,就是专门用来传输文件的协议。简单地说,支持FTP协议的服务器就是FTP服务器。FTP类似于百度云。
接下来我们来做一个简单的FTP
功能设计:
功能设想
服务器搭建思路
功能截图:
1.客户端连接服务器
2.客户端查看服务器文件,各种路径和路径下的文件
1.查看客户端下文件
2.下载服务器文件到客户端
3.上传客户端下文件到服务器
客户端退出,服务器提示客户端已退出
部分代码:
服务器代码
#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<string.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<stdlib.h>
#include"config.h"
#include<fcntl.h>
#include<sys/stat.h>
int get_cmd_type(char *cmd)
{
if(!strcmp("ls",cmd)) return LS;
if(!strcmp("quit",cmd)) return QUIT;
if(!strcmp("pwd",cmd)) return PWD;
if(strstr(cmd,"cd")!=NULL) return CD;
if(strstr(cmd,"get")!=NULL) return GET;
if(strstr(cmd,"put")!=NULL) return PUT;
return 100;
}
char *getDesDir(char *cmsg)
{
char *p;
p = strtok(cmsg," ");
p = strtok(NULL," ");
return p;
}
void msg_handler(struct Msg msg , int fd)
{
char dataBuf[1024]={
0};
char *file = NULL;
int fdfile;
printf("cmd : %s\n",msg.data);
int ret = get_cmd_type(msg.data);
switch(ret){
case LS:
case PWD:
msg.type = 0;
FILE *r = popen(msg.data,"r");
fread(msg.data,sizeof(msg.data),1,r);
write(fd,&msg,sizeof(msg));
break;
case CD:
msg.type = 1;
char *dir = getDesDir(msg.data);
printf("dir:%s\n",dir);
chdir(dir);
break;
case GET:
file = getDesDir(msg.data);
if(access(file,F_OK) == -1){
strcpy(msg.data,"NO this File!");
write(fd,&msg,sizeof(msg));
}else{
msg.type = DOFILE;
fdfile = open(file,O_RDWR);
read(fdfile,dataBuf,sizeof(dataBuf));
close(fdfile);
strcpy(msg.data,dataBuf);
write(fd,&msg,sizeof(msg));
}
break;
case PUT:
fdfile = open(getDesDir(msg.data),O_RDWR|O_CREAT,0666);
write(fdfile,msg.secondBuf,strlen(msg.secondBuf));
close(fdfile);
break;
case QUIT:
printf("client quit!\n");
exit(-1);
}
}
int main(int argc ,char **argv){
int s_fd;
int c_fd;
int n_read;
char readBuf[128];
struct sockaddr_in s_addr;
struct