Linux实现模拟百度网盘

项目背景:

随着信息网络技术的迅猛发展,云计算技术从它的概念提出已经开始在实际生产环境中使用了。大部分的东西都已经慢慢云端化,这种新型的技术也受到许多互联网人员的关注,网盘产品的诞生也是建立在云计算的基础之上的。除了移动设备外,大家也经常使用发送电子邮件方式来传输文件,但是大型的文件是不支持的。随着数据量不断增大,传统的网盘已经不能很好满足用户的需求,无论是在文件的传输速度上,还是文件保密性都存在一定得缺陷。不过,现在市面上有一些企业做网盘服务,比如腾讯公司和百度公司,百度网盘就是其中之一 ,百度网盘是中国最大的个人云存储服务,它除了提供云存储服务以外还提供了丰富的数据和内容应用类的服务,同时它也支持企业客户。

项目概述:

在Linux虚拟机上模拟一个百度网盘系统,运用网络编程,数据库,数据结构,C语言等知识综合起来实现功能,通过这个项目,可以让用户实现在虚拟机上的网盘操作,使其可以方便的存储,管理,共享自己的数据,开发时采用开源技术进行开发,让其拥有数据的相对安全性,多设备同步,大容量存储且简单易用的特点,具体实现功能如下:

功能1:实现网络客户端和服务端数据传送

功能2:实现文件下载

功能3:实现文件上传

功能4:实现并发服务器支持多个客户端同时下载或上传

功能5︰用数据库保存上传文件记录(文件编号文件名等)

功能6:服务端只支持下载数据库记录中保存的文件(每上传一个文件将文件名保存在数据库中每下载一个文件,先检查数据库中是否有,若有才能下载,没有报告服务端无此文件)

项目实现:

 该项目主要是依赖于数据库和网络编程这两大模块构成的,主要涵盖了下面这几点功能模块:

创建数据库并且添加表单:

int main()
{

	struct sqlite3 *g_db = NULL;
	char *pPath = NULL;
	char dbName[] = "/wrp";
	pPath = (char *) malloc (FILEPATH_MAX + 10);
	if (NULL == pPath)
	{
		return -1;
	}
	memset(pPath, 0, FILEPATH_MAX + 10);
	getcwd(pPath, FILEPATH_MAX);
	printf("%s %ld\n",pPath,strlen(pPath));
	memcpy(pPath + strlen(pPath), dbName, strlen(dbName));
	printf("%s %ld\n",pPath,strlen(pPath));
	//init db
	if (NULL != g_db)
	{
		//close db first
		int iResult = sqlite3_close(g_db);

		if(SQLITE_OK != iResult)
		{
			return -1;
		}
		g_db = NULL; 

	}

	//open or create db
	int re = sqlite3_open(pPath,&g_db);//连接数
	if(re != SQLITE_OK)
	{
		printf("打开数据库失败!\n");
		return SQLITE_OPEN_WAL;
	}
	printf("连接数据库成功!\n");
	//check global db handle
	if (NULL == g_db)
	{
		printf("create/open database error!\n");
		return -1;
	}

	char sqlCreateTable[] = "create table test (id integer primary key,"
		" name text not null,size int not null)";
	char *pErrMsg = NULL;
	int iResult = sqlite3_exec(g_db, sqlCreateTable, 0, 0, &pErrMsg);
	if(SQLITE_OK != iResult)
	{
		printf("%s\n", pErrMsg);
		sqlite3_free(pErrMsg);
		return -1;
	}
	printf("添加表单成功!!!\n");
	sqlite3_free(pErrMsg);
	//close db
	iResult = sqlite3_close(g_db);
	if (SQLITE_OK != iResult)
	{
		printf("invoke CloseConnection function error!\n");
		return -1;
	}

	//free memory
	free(pPath);
	pPath = NULL;
	return 0;
}

服务端:

基于TPC协议的框架:

服务端:socket-->bind-->listen-->accept-->IO函数(read/write recv/send)

select实现并发服务器

1 .  文件描述符集合表 

stFdr-->原文件描述符集合表

stFdrTmp-->临时文件描述符集合表  

2 .  select 监控 置位

3 .FD_ISSET(fd,&stFdrtmp)-->通过临时描述符集合表判断置位的结果并响应

将数据库中的可操作文件名传给客户端(下载)

其中包含了若不存在则重新下载的语句。

将文件内容发给客户端(下载)

接收客户端想要上传的文件及大小并存入数据库(上传)

删除数据(分为以编号删除和以文件名删除)

客户端:基于tcp协议的框架

客户端:socket-->connect-->IO函数

少了一点环节,客户端主要是用来下载服务端的文件和上传客户端的文件到数据表,同时也可以对表的内容进行删减增加。下面是一些相关的知识点总结:

1 套接字类型

  TCP---》SOCK_STREAM  可靠的---》三次握手 四次挥手

  UDP-->SOCK_DGRAM   不可靠的 丢包 重传  实时性好

2 协议

 总结:可靠性--》TCP  实时性--》UDP

IO模型:阻塞 非阻塞 多路复用 异步IO

 阻塞IO和非阻塞IO

 IO多路复用:select(5,&stFdr)  

3.TCP:

     服务端:socket-->bind-->listen->accept-->IO函数

     客户端:socket-->connect-->IO函数

  UDP:-->socket文件

4.网络体系结构

 定义:是指网络的分层模型和每层所使用的协议的集合

 有两种网络体系结构:OSI和TCP/IP

OSI七层模型:应用层 表示层 会话层 传输层 网络层             数据链路层  物理层--》理想化的模型TCP/IP四层模型:应用层  传输层  网络层  物理层

对于以上两种模型来说,除了物理层没有协议,其他各层都有对应的协议去完成该层相应的功能。

  5. IP地址

IP地址: 在网络中唯一标识一台主机的, 唯一标识一台主机的符号是MAC地址(硬件地址)

现在使用的IP地址是那个协议维护的IP地址?IPv4

 ipV4维护的IP地址宽度是4个字节。

4个字节的IP地址可表示的地址范围是:

0000 0000*4~1111 1111*4

可以分成5类:

  A类:1.0.0.1~126.255.255.254

 B类:127.0.0.1~191.255.255.254

 C类:192.0.0.1~223.255.255.254---》用户地址

 D类:224.0.0.1~239.255.255.254--》组播&多播地址

 E类:240以后

C类=24bit网络号+8bit主机号

6.网络协议

定义:通信双方对某种通信规则的约定

协议:通用的网络协议  TCP/IP协议栈(OS)

行业内部专用协议      协议开发

 7.端口号

 作用:用来区分应用进程                端口号是一个无符号的整数,范围:1~65535

 主机字节序:是指不同的CPU主机存贮多字节整数的方式,有大端序主机和小端序主机

大端序主机:数据的高字节存放在内存的地地址

小端序主机:数据的高字节存放在内存的高地址

  多字节整数发送前要从主机字节序转化成网络字节序,以适配对端的网络主机

    网络字节序:大端序和小端序

以上就是对网络编程的项目和知识点的相关总结和概括。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值