赞
踩
目录
把项目分三层、数据采集、数据传输和数据处理
安装必要的库
然后搭建tftp、nfs环境。其实这些前面已经搭建完成了。
一个项目首先需要有项目名比如这个就叫罗密欧,有项目组、组员和组长。还有时间。
然后引言:用来介绍一下项目是做什么的。可以解决什么实际问题。再什么场合下诞生的。项目是由谁发起的,贡献者都是谁。这部分是公司高层的战略什么的。
之后是功能的概述,
这是·一个项目的生命周期图
这也是模块化编程的思想,再企业中一般都会有一个很好的架构师,来对整个系统进行分块,安排每个人的任务。这个架构是老师写的。我有一个自己的项目当完成这个项目后我会尝试自己设计一下。
这部分是很重要的。软件每个版本的库可能都是不一样的。而硬件不同型号参数可能也会不一样。所以再做项目时一定要指明这些,不然对于维护的人员来说是很不负责的行为。上面其实不太恰当,不够具体。
-
- 1、ftp服务器功能展示
-
- 服务器端: 客户端:
- $ ./server 192.168.1.200 5001 $ ./client 192.168.1.200 5001
- server sockfd :3. **************************
- waiting client connect... ***请输入 help 查看选项***
- acceptfd :4. **************************
- 目录清单已经成功发送 input >>> help
- acceptfd :4. *****************************************
- 文件传送完成 ***输入/功能*****************************
- acceptfd :4. ***list : 查看服务器所在目录的所有文件***
- 接收文件成功 ***get 文件名 : 下载服务器目录的文件****
- ***put 文件名 : 上传文件到服务器********
- ***quit : 关闭客户端*********************
- *****************************************
- input >>> list
- ***hello.c
- ***world.c
- ***src
- ***server
- ***linux.c
- ***testfile
- 服务器目录已经接收完毕
- input >>> get world.c
- 下载完毕
- input >>> put readme.txt
- 上传完毕
- input >>> quit
-
-
- fengjunhui@ubuntu:~/www.makeru.com.cn/ftpserver/testfile$ diff ../world.c world.c
- fengjunhui@ubuntu:~/www.makeru.com.cn/ftpserver/testfile$ diff ../readme.txt readme.txt
-
-
- 2、需求拆解 ========== 头脑风暴
- 需要服务器和客户端:==========>CS模型:
-
- 框架选择:
- TCP通信
- UDP通信
- 广播通信
- 组播通信
-
- 并发需求:
- 并发的支持数量:
- 不常用的并发:
- 多进程---多线程
- 常用的并发
- select <1024
- poll 之间
- epoll 百万级别
-
- V1.0版本:
- 服务器端功能:
- 1、响应客户端的请求
- 2、发送文件
- 3、接收文件
-
- 客户端:
- 1、帮助的功能:
- 2、list : 查看服务器所在目录的所有文件
- 3、get 文件名 :下载服务器目录的文件
- 4、put 文件名 : 上传文件到服务器
- 5、quit : 关闭客户端
-
- V2.0版本: ==== 增加的功能
- 1、支持规模为1000以下的用户并发量
- 2、服务器端支持对客户端用户权限的管理,并设置管理员的功能
- 3、可以显示客户端当前的文件列表
- 4、每个客户端访问的日期信息要显示在服务器上
-
- V3.0版本: ==== 增加的功能
- 1、增加会员与非会员的区别
- 2、上传或下载的功能要采用多进程或多线程的方式实现
- 3、可以根据是否是会员来适当的提升下载速度
- 4、支持断点续传的功能
- 5、支持图片文件的传输
-
- V4.0版本: ==== 增加的功能
- 1、增加音频的传输功能
- 2、增加视频的编解码和传输功能
- 3、改进算法并提供扩展接口
- ......
-
- 没界面,哈哈,不过这就是C语言的魅力,所以大家在掌握C之后需要扩展一门高级语言,为以后打下良好的基础
-
-
- 3、框架选择
- TCP通信,暂时不需要支持并发
-
- 参考PPT
-
-
- 4、协议接口制定
-
- 一般情况下的通信结构体封装:
- //
- typedef struct msgbuf{
- char type; //服务或功能的类型
- char flag; //如果是管理员,flag = 1;
- char name[32];
- char passwd[16];
- char buf[1024]; //缓冲区,用来保存操作类型的具体内容
- }MSG_t;
-
-
- V1.0版本:
- 服务器端功能:
- 1、响应客户端查询请求 ========== L int process_list(int acceptfd)
- 2、发送文件 ========== G int process_download(int acceptfd, char *filename)
- 3、接收文件 ========== P int process_upload(int acceptfd, char *filename)
-
- 客户端:
- 1、帮助的功能:
- int process_help(void)
- 2、list : 查看服务器所在目录的所有文件 ========== L
- int process_list(struct sockaddr_in server_addr)
- 3、get 文件名 :下载服务器目录的文件 ========== G
- int process_download(struct sockaddr_in server_addr, char *filename)
- 4、put 文件名 : 上传文件到服务器 ========== P
- int process_upload(struct sockaddr_in server_addr, char *filename)
- 5、quit : 关闭客户端 ========== Q
-
-
-
-
-
- 客户端:
- int main(int argc, const char *argv[])
- {
- struct sockaddr_in server_addr;
- 填充:
- printf("**************************\n");
- printf("***请输入 help 查看选项***\n");
- printf("**************************\n");
- while(1)
- {
- //可在终端输入需要的内容
- printf("input >>> ");
- fgets(buf, N, stdin);
- buf[strlen(buf) - 1] = '\0';
- //在终端输入help可以显示功能
- if(strncmp(buf, "help", 4) == 0){
- process_help();
- }else if(strncmp(buf, "list", 4) == 0){
- process_list(server_addr);
- }else if(strncmp(buf, "get", 3) == 0) //get filename{
- process_download(server_addr, buf + 4);
- }
- else if(strncmp(buf, "put", 3) == 0){
- process_upload(server_addr, buf + 4); //put filename
- }else if(strncmp(buf, "quit", 4) == 0){
- break;
- }else{
- printf("Error command.\n");
- }
- }
- return 0;
- }
-
-
-
- 服务器端:
- int main(int argc, const char *argv[])
- {
- socket
- 填充
- bind
- listen
- printf("waiting client connect...\n");
- while(1)
- {
- if((acceptfd = accept(sockfd, NULL, NULL)) < 0)
- {
- err_log("fail to accept");
- }
- printf("acceptfd :%d.\n",acceptfd);
- recv(acceptfd, buf, N, 0);
- switch(buf[0])
- {
- case 'L':
- process_list(acceptfd);
- break;
- case 'G':
- process_download(acceptfd, buf + 2); //G filename
- break;
- case 'P':
- process_upload(acceptfd, buf + 2); //P filenamea
- break;
- default:
- printf("Error command\n");
- break;
- }
- }
-
- return 0;
- }
-
-
- 通信协议和函数接口定好之后,套框架
-
-
- 5、接口实现
- 参考代码:
-
-
-
- 6、功能调试
- ......

响应速度就是延时的毫秒数,准确性连续运行几个月都不出错。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。