目录
一、项目概要
二、环境搭建
三、需求分析
把项目分三层、数据采集、数据传输和数据处理
安装必要的库
然后搭建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、功能调试
......
响应速度就是延时的毫秒数,准确性连续运行几个月都不出错。