Linux文件服务站 (上)

116 阅读3分钟

4月「掘金·日新计划」第12天

一、功能描述

比上一版本: 增加信号量互斥与同步,get put传输大容量文件(分批传输),服务器可以正常退出(垃圾清理),可以远距离外网访问

下一版本优化: CRC校验,账号密码登录

  1. 客户端(树莓派)

    1. 对服务器的操作

      1. 实现指令 ls,rm,cd,pwd
      2. 获取,上传文件(get,put)
      3. 获取主服务器和副服务器pid
    2. 对客户端本机的操作

      1. lls,lrm,lcd,lpwd
    3. 退出,断开服务器(quit)

  2. 服务器(虚拟机)

    1. 处理客户端的命令ls,rm,cd,pwd,get,put,pid
  3. 详细描述(特点难点)

    1. 支持多台客户端同时接入,每接入一个客户端,fork一个进程去管理

    2. 支持一次性上传下载大容量文件

    3. 主、副服务器协同处理数据

      1. 主服务器,获取客户端指令放入共享内存,等待副服务器处理,完成后数据传回客户端
      2. 副服务器,拿出共享内存指令,处理,完成后放回共享内存
      3. 主、副服务器之间,涉及到临界资源的竞争(使用信号量解决竞争和同步问题)
    4. 服务器的退出,使用信号传入,使其退出

二、遇到的问题和未解决的问题

  1. 信号量,客户端退出后,信号量值错乱了

    1. 解决:semop函数的sem_flag参数

      1. 0代表阻塞调用

      2. IPC_NOWAIT代表非阻塞调用

      3. SEM_UNDO,在进程结束时,相应的操作将被取消

        进程没有释放共享资源就退出时,内核将代为释放。

    2. SEM_UNDO,使信号量值变错乱 sem_flag参数设置为0解决

  2. 资源竞争问题,共享内存的竞争

    1. 信号量的同步与互斥

    2. 使用3个信号量

      1. 一个互斥共享内存,同一时间只能一个进程访问,一次访问处理一次数据

      2. 另外2个,实现同步问题

        1. 放入共享内存,v1操作通知副服务器去处理
        2. 处理完成,v2操作通知主服务器
  3. 文件超出共享内存大小(传输大文件)

    1. 分批次传输
    2. 文件拆分开,分多次传输
  4. 外网传输数据错乱

    1. 错乱后清空socket接收缓存区
    2. 设置缓存区大小,和发送接收大小一致
    3. 禁用Nagle算法
    4. 重传机制
  5. 未解决bug

    1. 客户端cd改变服务端位置后,其他客户端的位置也随之改变
    2. 客户端ip不对
    3. put不能连续使用

三、代码流程图及进程任务

  1. 服务器

    1. 主服务器负责(接收命令,放入共享内存等待处理)

      1. 启动副服务器
      2. 客户端接入,fork进程去管理(quit命令退出结束进程)
      3. 接收网络数据,放入共享内存1,等待数据处理读共享内存2
    2. 副服务器负责(拿出共享内存命令,处理)

      1. 读取共享内存1,处理命令,数据放入共享内存2
  2. 客户端

    1. 等待键盘输入命令
    2. 判断本机还是远程操控命令
    3. 发送命令,等待数据传回,输出
  3. quit进程

    1. 退出服务器使用
    2. 客户端使用pid命令,查看主、副服务器进程pid
    3. 给quit进程分别传入,副服务器pid和主服务器pid

流程图.png