Linux--模拟百度网盘实现文件传输项目

Linux--模拟百度网盘实现文件传输项目


最近一直在改简历,做了好几个项目,最终确定了自己的定位是后台开发,做了两个项目在简历上,其中一个就是这个。废话不说了,先减少一下项目吧。

项目名称:Linux 系统下的模拟百度网盘实现文件传输项目    

项目简介:用C/C++语言模拟百度网盘,实现 Windows 与 Linux 之间上传,下载,交互文件。

项目环境:Red Hat  Enterprise   Linux 6

具体实现:采用多线程编程,用创建监听套接字 socket ,用TCP协议,实现交互方式,先创建管道,然后fork产生子进程,在子进程中用exec函数进行替换命令,用管道写端dup2覆盖替换标准输出,然后父进程将管道数据读出,发送给客户端,实现下载方式,用自定义协议,服务器端给客户端发送两次接收两次,用 sendfile 函数零拷贝发送,进度条显示下载进度,断点续传,上传文件过程中实现秒传。

因为简历位置有限,只能写这么多,现在让我慢慢唠叨过程吧。

        本项目是实现了在不同服务器上进行文件的交互,上传以及下载。首先肯定是建立连接。本项目用的是多线程,因为是小项目,规模不大,实现百台设备间交互是可以的。创建监听套接字 socket ,用了TCP协议,因为它面向连接,更加可靠。用UDP也可以,只是比较麻烦。TCP协议和UCP协议区别就是,TCP是面向连接的、可靠的、基于字节流的传输层通信协议。UDP是无需建立连接,不可靠,面向报文。TCP只能点到点,而UDP不但支持一对一,还可以一对多,多对一,多对多的交互通信。实现服务器端与多个客户端连接之后,先考虑实现交互。本质上就是想在客户端也可以操作文件,比如实现ls,rm,mv等简单命令。首先我们要设定自定义协议,我设定的输入命令方式模拟Linux系统命令,比如ls就是系统的ls。

        交互具体实现过程,先用pipe创建无名管道,pipefd[0]是用于读管道,pipefd[1]是用于写管道。pipe函数返回值为0 是成功,返回-1代表失败。然后服务器端的fork产生子进程,将接收的字符串先用strtok分割字符串,在子进程中具体用execvp函数进行替换命令,用管道写端dup2覆盖替换标准输出,在这编写代码时,应该在子进程中关闭读端,在父进程中关闭写端,为保证文件读写安全。然后父进程将管道数据读出,发送给客户端。

        实现下载方式,用自定义协议,服务器端给客户端比如发送get a.c代表想要下载a.c文件,服务端给客户端如果回复:YES#20,代表找到了a.c文件,并且文件大小是20字节,文件大小用lseek函数算出,如果回复ERR,就在客户端输出“此文件找不到或者没有权限下载”。客户端收到存在文件时,回复:YES#0,代表好的,我要下载,并且我只下载了0字节,也就是没下载,那么回复:YES#10,代表我已经下载了10 字节,麻烦接着再给我传。这里就解决了断点续传的问题,假如客户端由于某种原因断开第一次传送,服务器端用信号捕获客户端发生异常,然后关闭写端,等客户端想要再次下载时,给服务端发送以及下载的位置,就可以实现断点续传,在发送文件时,用 sendfile 函数实现零拷贝发送,在下载文件的时候进度条显示下载进度,用"\r"调整光标,记得下载完成时写上退出条件,可以用文件大小比较来做退出条件。sendfile 函数其实为了解决客户端下载文件后又要由服务端保存,为提高效率及性能。

Linux--模拟百度网盘实现文件传输项目_第1张图片

你可能感兴趣的:(Linux,C++)