Linux 程序设计实验大作业相关说明
2017020800080 匡胤鑫
基本功能和加分功能全部实现,采用 Automake 组织工程,支持安装进系统,默认安装
路径为 usr/local/bin,默认 ftp 存储路径为 usr/local/share/ftpserver/ftp,默认用户信息存储
路径为 usr/local/share/ftpserver/users(该文件存储用户名和密码)。使用前请务必分别在
ftpserver 和 ftpclient 目录以 root 权限使用 make install 命令安装,不安装也可以,目录在
ftpserver 运行时会自动生成,但是所需用户信息文件需手动放置。因为权限相关操作需要
借助系统自身,服务器端主机上务必已存在和 users 中用户名相同的用户(已给出生成和删
除的脚本)。因为涉及到为不同用户文件设置和修改权限问题,服务器端应使用 root 用户运
行。已实现功能涵盖 PPT 所有内容,其中:
权限方面针对每一个用户而言,可以在服务器限定的/ftp 根目录下随意上传文件、建立
文件夹,或者在自己建立的文件夹下上传文件,仅可以下载自己和与自己同组用户所上
传的文件。
服务器端采用多线程设计,请求监听与服务器端的命令控制(站点统计和管理功能)为
两个不同的线程,针对监听到的每个用户还会再开一个单独的线程处理。
对于 binary 模式和 ascii 模式,默认当 ascii 模式开启时,认定客户为 Windows,将用户
所传来的文件转换为 Linux 格式(在服务器端完成),将用户下载的文件转换成 Windows
格式(在客户端完成),转换工作由接收方完成,发送方永远按照原文件传输,以便接
收方记录符合发送方位置的断点下次续传时告诉给发送方。
实现文件缓冲区,实现思路为根据 ino 和 mtime 确定文件(结构体),统计所有 get 请
求中出现的文件被下载的次数,为最高者 malloc 一块堆区内存,往后的 get 请求中先
为所请求文件下载次数加 1,识别所请求文件是否为最高文件,如果是,则直接从内存
中读取数据发送,如果不是则采用传统办法发送。当有新的最高者出现时,free 该内存
并替换为新的最高者,当统计队列满时,自动去掉最早记录的一个下载量最少的文件,
并在该位置记录新文件被下载的次数。
实现断点续传,实现思路为在发生断开后(发送方发来 FAILED 信息,或者最后没有收
到以 END 标识打头的数据包),则在本地建立一个名为原文件名.temp 的文件,保存一
个整型,记录断点位置,如果是 ascii 模式则再保存上一次传输的数据中最后传输的一
位字符以便 Linux/Windows 之间对 和 的转换时的需要(转换需要确定出现的
的上一位是否为)。
实现超时 20 分钟后自动 kill 用户。
实现根据标准 crc32c 多项式生成的打表法的 crc32c 循环冗余码计算函数,但考虑到效
益未实际使用,相关函数在源码中保留。
程序中所用到的所有常量均在 util.h 文件中定义,可根据实际修改。
程序中未使用通过%s 的 scanf,防止输入溢出,均采用 getchar 根据常量限定最多输入
字符,防止 char 数组越界。
所有为用户创建的线程均记录了各自工作的绝对路径,避免了因为一个进程仅有一个工
作路径只能上锁解锁实现路径切换的情况,同时进程本身工作路径默认为 ftp 文件夹的
所在路径,每当用户对服务器发送 pwd 请求时,自动返回其线程绝对路径减去 ftp 目录
的绝对路径,这样保证了用户无法看到 ftp 文件夹在服务器上的实际位置。
客户端登录时自动切换本地工作路径为当前系统登录的用户的主目录。
评论0
最新资源