4月「掘金·日新计划」第12天
一、功能描述
比上一版本: 增加信号量互斥与同步,get put传输大容量文件(分批传输),服务器可以正常退出(垃圾清理),可以远距离外网访问
下一版本优化: CRC校验,账号密码登录
-
客户端(树莓派)
-
对服务器的操作
- 实现指令 ls,rm,cd,pwd
- 获取,上传文件(get,put)
- 获取主服务器和副服务器pid
-
对客户端本机的操作
- lls,lrm,lcd,lpwd
-
退出,断开服务器(quit)
-
-
服务器(虚拟机)
- 处理客户端的命令ls,rm,cd,pwd,get,put,pid
-
详细描述(特点难点)
-
支持多台客户端同时接入,每接入一个客户端,fork一个进程去管理
-
支持一次性上传下载大容量文件
-
主、副服务器协同处理数据
- 主服务器,获取客户端指令放入共享内存,等待副服务器处理,完成后数据传回客户端
- 副服务器,拿出共享内存指令,处理,完成后放回共享内存
- 主、副服务器之间,涉及到临界资源的竞争(使用信号量解决竞争和同步问题)
-
服务器的退出,使用信号传入,使其退出
-
二、遇到的问题和未解决的问题
-
信号量,客户端退出后,信号量值错乱了
-
解决:semop函数的sem_flag参数
-
0代表阻塞调用
-
IPC_NOWAIT代表非阻塞调用
-
SEM_UNDO,在进程结束时,相应的操作将被取消
进程没有释放共享资源就退出时,内核将代为释放。
-
-
SEM_UNDO,使信号量值变错乱 sem_flag参数设置为0解决
-
-
资源竞争问题,共享内存的竞争
-
信号量的同步与互斥
-
使用3个信号量
-
一个互斥共享内存,同一时间只能一个进程访问,一次访问处理一次数据
-
另外2个,实现同步问题
- 放入共享内存,v1操作通知副服务器去处理
- 处理完成,v2操作通知主服务器
-
-
-
文件超出共享内存大小(传输大文件)
- 分批次传输
- 文件拆分开,分多次传输
-
外网传输数据错乱
- 错乱后清空socket接收缓存区
- 设置缓存区大小,和发送接收大小一致
- 禁用Nagle算法
- 重传机制
-
未解决bug
- 客户端cd改变服务端位置后,其他客户端的位置也随之改变
- 客户端ip不对
- put不能连续使用
三、代码流程图及进程任务
-
服务器
-
主服务器负责(接收命令,放入共享内存等待处理)
- 启动副服务器
- 客户端接入,fork进程去管理(quit命令退出结束进程)
- 接收网络数据,放入共享内存1,等待数据处理读共享内存2
-
副服务器负责(拿出共享内存命令,处理)
- 读取共享内存1,处理命令,数据放入共享内存2
-
-
客户端
- 等待键盘输入命令
- 判断本机还是远程操控命令
- 发送命令,等待数据传回,输出
-
quit进程
- 退出服务器使用
- 客户端使用pid命令,查看主、副服务器进程pid
- 给quit进程分别传入,副服务器pid和主服务器pid