(1)写项目需用到的知识点和实现的功能:

1.linux系统编程:进程,文件,socket网络编程等
2.C语言编程:函数调用、字符串函数、结构体等
3.实现的功能:
(1)获取服务端的文件:get xxx
(2)展示服务器有哪些文件:ls
(3)进入服务器的文件夹:cd xxx
(4)上传文件到服务器:put xxx
(5)查看服务器当前路径:pwd
(6)展示客户端有哪些文件:lls
(7)进入客户端的文件夹:lcd xxx
(8)查看客户端当前路径:pwd

(2)一些比较陌生的函数调用:

头文件:#include<stdio.h>
定义函数:int fflush(FILE * stream);
函数说明:fflush()会强迫将缓冲区内的数据写回参数stream指定的文件中,如果参数stream为NULL,fflush()会将所有打开的文件数据更新。
返回值:成功返回0,失败返回EOF,错误代码存于errno中。
fflush()也可用于标准输入(stdin)和标准输出(stdout),用来清空标准输入输出缓冲区。
stdin是standard input的缩写,即标准输入,一般是指键盘;标准输入缓冲区即是用来暂存从键盘输入的内容的缓冲区。
stdout是standard output 的缩写,即标准输出,一般是指显示器;标准输出缓冲区即是用来暂存将要显示的内容的缓冲区。
头文件:<io.h>
定义函数:int _access(char* path,int mode)
函数说明:确定文件或文件夹的访问权限。如果指定的存取方式有效,则函数返回0,否则函数返回-1。
参数path 是访问文件所在的路径名,mode是访问判断模式,
具体含义如下:R_OK 只判断是否有读权限W_OK 只判断是否有写权限X_OK 判断是否有执行权限F_OK 只判断是否存在

(3)代码实现分为3个部分:config.h,server.c,client.c:

1.config.h:

#define LS      0
#define GET     1
#define PWD     2
#define IFGO    3
#define LCD     4
#define LLS     5
#define CD      6
#define PUT     7
#define QUIT    8
#define DOFILE  9
#define LPWD    10
struct Msg
{int type;char data[1024];char secondBuf[128];
};

2.server.c:

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string.h>
#include "config.h"
//#include "server.h"
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.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,"put") != NULL)  return PUT;if(strstr(cmd,"get") != NULL) return GET;if(strstr(cmd,"cd") != NULL)  return CD;return 100;
}char *getDesDir(char *cdg){char *p;p = strtok(cdg," ");p = strtok(NULL," ");return p;}void msg_handler(struct Msg msg,int fd)//实现各个命令
{char databuf[1024]={0};char *file=NULL;int fdfile;int ret;printf("cmd:%s\n",msg.data);ret=get_cmd_type(msg.data);printf("ret = %d\n",ret);switch(ret){case LS:case PWD:msg.type=0;FILE *r=popen(msg.data,"r");fread(msg.data,sizeof(msg.data),1,r);printf("%s",msg.data);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,"File is inexistent");write(fd,&msg.data,sizeof(msg));}else{msg.type=DOFILE;fdfile=open(file,O_RDWR);read(fdfile,databuf,sizeof(databuf));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;struct sockaddr_in s_addr;   struct sockaddr_in c_addr;struct Msg readbuf;s_fd = socket(AF_INET,SOCK_STREAM,0);if(s_fd == -1){perror("socket");exit(-1);}if(argc != 3){printf("get quit\n");exit(-1);}memset(&s_addr,0,sizeof(struct sockaddr_in));memset(&c_addr,0,sizeof(struct sockaddr_in));s_addr.sin_family = AF_INET;s_addr.sin_port = htons(atoi(argv[2]));inet_aton(argv[1],&s_addr.sin_addr);bind(s_fd,(struct sockaddr*)&s_addr,sizeof(struct sockaddr_in));listen(s_fd,10);int len = sizeof(struct sockaddr_in);  while(1){c_fd=accept(s_fd,(struct sockaddr *)&c_addr,&len);if(c_fd==-1){perror("accept");}printf("get connet:%s\n",inet_ntoa(c_addr.sin_addr));   //核心代码,利用fork进程来实现多个客户端的接入,并保证一个客户端退出,不会影响其他的客户端。if(fork()==0){while(1){memset(readbuf.data,0,sizeof(readbuf.data));n_read=read(c_fd,&readbuf,sizeof(readbuf));if(n_read==0){printf("client out\n");break;}else if(n_read > 0){msg_handler(readbuf,c_fd);}}}}close(s_fd);close(c_fd);return 0;
}

3.client.c:

#include <stdio.h>
#include <sys/stat.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include "config.h"
//#include "client.h"
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>int get_cmd_type(char *cmd){if(strstr(cmd,"lcd"))    return LCD;if(!strcmp("ls",cmd))  return LS;if(!strcmp("lls",cmd))  return LLS;if(!strcmp("quit",cmd))    return QUIT;if(!strcmp("pwd",cmd))    return PWD;if(!strcmp("lpwd",cmd))    return LPWD;if(strstr(cmd,"put")) return PUT;if(strstr(cmd,"get"))  return GET;if(strstr(cmd,"cd"))   return CD;return -1;
}
char *getdir(char *cdg){char *p;p = strtok(cdg," ");p = strtok(NULL," ");return p;}int cmd_handler(struct Msg msg,int fd)//实现各个命令
{char *dir=NULL;char buf[32];int ret;int filefd;ret=get_cmd_type(msg.data);switch(ret){case LS:case CD:case PWD:msg.type=0;write(fd,&msg,sizeof(msg));break;case GET:msg.type=2;write(fd,&msg,sizeof(msg));break;case PUT:strcpy(buf,msg.data);dir=getdir(buf);if(access(dir,F_OK)==-1){printf("%s not exsit\n",dir);}else{filefd=open(dir,O_RDWR);read(filefd,msg.secondBuf,sizeof(msg.secondBuf));close(filefd);write(fd,&msg,sizeof(msg));}break;case LLS:system("ls");break;case LCD:dir=getdir(msg.data);chdir(dir);break;case LPWD:system("pwd");break;case QUIT:strcpy(msg.data,"quit");write(fd,&msg,sizeof(msg));close(fd);exit(-1);}return ret;}void handler_server_message(int c_fd,struct Msg msg)//将客户端的一些信息发送给服务端
{int n_read;struct Msg msgget;int newfilefd;n_read=read(c_fd,&msgget,sizeof(msgget));if(n_read==0){printf("server is out,quit\n");exit(-1);}else if(msgget.type==DOFILE){char *p=getdir(msg.data);newfilefd=open(p,O_RDWR|O_CREAT,0600);write(newfilefd,msgget.data,strlen(msgget.data));putchar('>');fflush(stdout);}else{printf(".............................\n");printf("\n%s\n",msgget.data);printf(".............................\n");putchar('>');fflush(stdout);}}int main(int argc,char **argv){int c_fd;int mark;struct sockaddr_in c_addr;struct Msg readbuf;c_fd = socket(AF_INET,SOCK_STREAM,0);if(argc != 3){printf("param is no good\n");exit(-1);}c_addr.sin_family = AF_INET;c_addr.sin_port = htons(atoi(argv[2]));inet_aton(argv[1],&c_addr.sin_addr);connect(c_fd,(struct sockaddr*)&c_addr,sizeof(struct sockaddr));mark = 0;while(1){memset(readbuf.data,0,sizeof(readbuf.data));if(mark == 0){ printf(">");}gets(readbuf.data);if(strlen(readbuf.data) == 0){if(mark == 1){printf(">");}continue;}mark = 1;int ret = cmd_handler(readbuf,c_fd);if(ret > IFGO){printf(">");fflush(stdout);continue;}if(ret == -1){printf("connect over\n");printf(">");fflush(stdout);continue;}handler_server_message(c_fd,readbuf);}
}

linux系统文件中转站(ftp服务)项目—实现在2台不同主机之间相关推荐

  1. Linux下检测FTP服务并开启FTP服务

    Linux下检测FTP服务并开启FTP服务 1. 检测FTP服务是否开启 通过查询提供FTP服务的进程是否存在 Shell代码   ps -ef | grep ftp   并未找到任何包含ftp关键字 ...

  2. linux怎么配置ftp服务,Ubuntu下安装、配置FTP服务

    续根据前两篇 http://www.linuxidc.com/Linux/2011-09/42775.htm 与 http://www.linuxidc.com/Linux/2011-09/42777 ...

  3. linux命令:FTP服务

    FTP:file transfer protocol 文件传输协议 端口:21/tcp 文件共享服务: NFS:network file system (RPC: Remote procedure c ...

  4. linux中的FTP服务配置详解

    本文主要内容有:linux中安装vsftpd(也就是FTP服务). 1.使用匿名用户上传和下载文件. 2.使用身份验证的方式上传和下载文件. 3.建立虚拟用户(步骤比较多). 4.为单独的用户建立单独 ...

  5. 基于Linux CentOS搭建FTP服务

    vsftpd(very secure FTP daemon)是一款在Linux发行版中最受推崇的FTP服务器.vsftpd支持匿名访问和本地用户模式两种访问方式.匿名访问方式任何用户都可以访问搭建的F ...

  6. linux搭建ftp服务器可上传下载,通过linux系统搭建ftp服务然后使用filezilla客户端进行上传下载...

    1.         准备环境 一台linux主机作为ftp服务器(这里以centos7.2系统为例),一台Windows系统的主机作为客户端 2.         服务端配置: (1)   下载vs ...

  7. 局域网内Linux下开启ftp服务的“曲折路”和命令复习

    今天主要学习了Linux下网络配置以及vsftp(FTP)和samba的服务配置,学习起来,难度也就一般,并没有特别难,可是在可以做实验的时候,却并没有自己想像的那么顺利,可见,很多事情看起来不难,做 ...

  8. Linux环境安装FTP服务Serv-U

    需求:在Linux环境上安装FTP服务端Serv-U 解决方案: 1.下载Serv-U的linux 64bit的安装文件(如果要安装ftp的机器外网不通,则需要本地下载后上传到该机器) wget  h ...

  9. java ftp返回到根目录,Linux下搭建ftp服务,更改根目录到大存储到位置

    Linux下ftp服务可以通过搭建vsftpd服务来实现,以CentOS为例,首先查看系统中是否安装了vsftpd,可以通过执行命令 rpm -qa | grep vsftpd 来查看是否安装相应的包 ...

最新文章

  1. bing浏览器_Bing正式改名Microsoft Bing:不再只是搜索
  2. 一、Axis2 WebService开发准备工作
  3. oracle spm buffer get比较过程,Oracle 11g 新特性 -- SQL Plan Management 示例
  4. python主要用来开发什么-python主要用于什么开发?
  5. hdu 527 Necklace
  6. JSP EL表达式 将数组拼接成字符串
  7. 《当程序员的那些狗日日子》(三十六)无名的配角
  8. 十二之续、快速排序算法的深入分析
  9. 【报告分享】迈向万亿市场的直播电商-毕马威+阿里研究院.pdf(附下载链接)...
  10. RabbitMQ入门教程
  11. Selenium Automated test 's Installation environment
  12. gtest简短,简单易用
  13. jQuery EasyUI/TopJUI创建树形表格下拉框
  14. cat3 utp是不是网线_CAT网线品种分类
  15. 遇到svn is already locked 解决办法
  16. 诺贝尔获奖者中村修二:东亚教育问题的根源在哪?
  17. 新手PADS踩坑之旅-layout asc文件导入导出错误
  18. 【​观察】从移动计算当道 看高通“高举高打”背后的势能
  19. 购买安防监控摄像头时如何省钱
  20. 湖北省211大学计算机分数线,2017年211高校各省市录取分数线汇总

热门文章

  1. 学习分享:fork函数与vfork函数的区别
  2. 【Unity】项目内UI图片丢失不显示
  3. 一键重启打印服务方法
  4. SVN里恢复到某一天的版本操作
  5. VMware 虚拟机扩展 CentOS7 系统磁盘空间
  6. python pdf 转 图片、pdf 转 word、 word 转 pdf
  7. plc的毕业设计冷门题目_基于plc的84个毕业论文题目
  8. GNSS定位的时空基准
  9. Linux中mysql密码重置
  10. 服务器做阵列5四个硬盘,RAID 5至少需要三块磁盘实现,Windows Server 2008创建RAID 5卷...