3.1 main 函数的框架

3.2 首先进行命令行合法性检测

在服务器端应该设置服务器的端口号等信息,通过命令行参数的形式传递给服务器程序:

if (argc != 2)

{

printf("usage: ./ftserve port\n");

exit(0);

}

3.2 获取服务器端口号并创建监听套接字

按理说应该在端口 21 上开启 FTP 服务,这里提供一个更灵活的方式,让操作人员可以自由选择端口。

获取端口号,并转换为整数:

port = atoi(argv[1]);

创建监听套接字:

创建方式可以参看课程 C 语言实现聊天室软件,这里不再赘述。本实验中调用 socket_create 自定义模块创建监听套接字:

if ((sock_listen = socket_create(port)) < 0 )

{

perror("Error creating socket");

exit(1);

}

3.3 创建死循环监听客户机的请求

这部分的框架就是利用创建好的接听套接字 sock_listen 循环监听客户端的连接请求,一旦监听到客户端的连接请求,则创建子进程处理这个已连接的套接字。

监听套接字接受连接请求,得到控制套接字,用于传递控制信息:

sock_control = socket_accept(sock_listen)

创建子进程处理用户请求:

if ((pid = fork()) < 0)

perror("Error forking child process");

子进程调用 ftserve_process 函数与客户端交互

else if (pid == 0)

{

close(sock_listen);

ftserve_process(sock_control);

close(sock_control);

exit(0);

}

四、ftserve_process 模块

ftserve_process 模块提供对某个用户的服务请求。ftserve_process 模块的生命周期是客户端从连接上服务器的开始到结束。完成的功能主要有:

用户认证

处理用户的请求

4.1 模块的框架

4.2 用户认证

首先发送欢迎应答码:

send_response(sock_control, 220);

调用 ftserve_login 函数认证:

if (ftserve_login(sock_control) == 1)

send_response(sock_control, 230);

else

{

send_response(sock_control, 430);

exit(0);

}

4.3 处理用户的请求

首先这是一个利用死循环来不停的接收客户端的指令,来提供服务的:

while (1) {}

下面我们来看看循环体中的内容:

第一步:接收命令,并解析,获得命令和参数:

int rc = ftserve_recv_cmd(sock_control, cmd, arg);

第二步:创建和客户端的数据连接:

sock_data = ftserve_start_data_conn(sock_control)

第三步:执行指令:

if (strcmp(cmd, "LIST")==0)

ftserve_list(sock_data, sock_control);

else if (strcmp(cmd, "RETR")==0)

ftserve_retr(sock_control, sock_data, arg);

五、用户登录

函数 ftserve_login 的逻辑非常简单,先获取用户名和密码,然后调用ftserve_check_user(user, pass) 通过查看 ".auth" 文件 中的用户信息,验证该用户的合法性。

5.1 模块框架

5.2 获取用户名

首先应该接受客户端包含用户名的注册信息,并保存到 buf 中:

if ( (recv_data(sock_control, buf, sizeof(buf)) ) == -1)

{

perror("recv error\n");

exit(1);

}

获得用户名。因为 buf 中的前四个字符为命令字符 USER,所以真正的用户名应该是从 buf[5] 开始的,代码如下:

int i = 5;

int n = 0;

while (buf[i] != 0)

user[n++] = buf[i++];

send_response(sock_control, 331);

5.3 获得用户密码

首先应该接受客户端包含用户密码的信息,并保存到 buf 中:

if ( (recv_data(sock_control, buf, sizeof(buf)) ) == -1)

{

perror("recv error\n");

exit(1);

}

获得用户密码。因为 buf 中的前四个字符为命令字符 PASS,所以真正的用户名应该是从 buf[5] 开始的,代码如下:

i = 5;

n = 0;

while (buf[i] != 0)

pass[n++] = buf[i++];

5.4 用户名和密码验证

调用 ftserve_check_user(user, pass) 函数验证用户的合法性,输入为刚才获得的用户名(user)和密码(pass),代码如下:

return (ftserve_check_user(user, pass));

ftserve_check_user(user, pass) 函数最主要的步骤就是和 ".auth" 文件的信息做比对。

具体代码如下:

if ((strcmp(user,username)==0) && (strcmp(pass,password)==0))

{

auth = 1;

break;

}

来源: 实验楼

链接: https://www.shiyanlou.com/courses/1000

本课程内容,由作者授权实验楼发布,未经允许,禁止转载、下载及非法传播

实验大作业c语言实现简单ftp,C 语言实现 FTP 服务器相关推荐

  1. 西工大数据库实验大作业 火锅店菜品管理系统

    西工大数据库实验大作业 火锅店菜品管理系统 文章目录 西工大数据库实验大作业 火锅店菜品管理系统 前言: 一.大作业简单的需求分析: 二.数据流图: 三.数据字典: 四.E-R图: 五.关系模式设计: ...

  2. 基于eNSP的IPv4加IPv6的企业/校园网络规划设计(综合实验/大作业)

    作者:BSXY_19计科_陈永跃 BSXY_信息学院_名片v位于结尾处 注:未经允许禁止转发任何内容 基于eNSP的IPv4加IPv6的企业/校园网络规划设计_综合实验/大作业 前言及技术/资源下载说 ...

  3. 江南大学C语言大作业,TCPIP大作业基于TCP的网络通信编程C语言版(江南大学).doc...

    TCPIP大作业基于TCP的网络通信编程C语言版(江南大学).doc TCP/IP协议编程大作业 课题名称 基于TCP的网络通信 专 业 计算机科学与技术 班 级 计算机1206 学 号 103041 ...

  4. 象棋快棋赛电子裁判计时器的设计——《数字逻辑与数字系统设计》实验大作业设计报告

    数电Github资源 <数字逻辑与数字系统设计>实验大作业设计报告 实验题目 象棋快棋赛电子裁判计时器的设计 实验难度 ★★ 成员 姓名 班号 学号 1 郭茁宁 1837101 11837 ...

  5. HTML5期末大作业:红酒主题——简单的品牌红酒销售网页设计(4页) HTML+CSS+JavaScript 期末大作业HTML代码

    HTML5期末大作业:红酒主题--简单的品牌红酒销售网页设计(4页) HTML+CSS+JavaScript 期末作业HTML代码 学生网页课程设计期末大作业下载 web网页设计制作成品 常见网页设计 ...

  6. 数字图像处理课程(作业+实验+大作业)相关文章 传送门

    数字图像处理课程(作业+实验+大作业)相关文章 传送门 博文说明 本文所使用代码或多或少参考了以往博文的同类or相似文章的代码,并非纯原创 本文仅用于记录并提供一种代码思路,供大家参考 文章目录 数字 ...

  7. matlab数学实验 南邮,matlab实验练习题(计算机)-南邮-matlab-数学实验大作业答案

    matlab实验练习题(计算机)-南邮-matlab-数学实验大作业答案 1"MATLAB"练习题练习题要求:抄题.写出操作命令.运行结果,并根据要求,贴上运行图.1.求的所有根. ...

  8. 哈工大(威海)算法实验一:分治算法实验大作业

    哈工大(威海)算法实验一:分治算法实验大作业 题目 某一高等院校有汽车学院.材料学院.计算机学院.软件学院:每个学院的一年级第一学期都开英语.高数.线代课程.每个学院每学期的成绩已经分别登录在同一个E ...

  9. 大一c语言大作业课题大全,昆明理工大学大一C语言大作业题目.doc

    昆明理工大学大一C语言大作业题目 综合性实践排序求平均值(包括将数拆散求最大最小值).函数ReadDat()随机产生100个存放到数组aa中00个jsSort()函数的功能是:进行降序排列.最后调用函 ...

  10. 数据结构实验大作业(将之前预测ACM获奖的模型搬到Vue和django上)

    目录 前言 成品展示(UI写的确实有点糊弄,太懒了不想弄了) Vue部分 App.vue(中间感觉还行,不算难看) result组件: 路由: Django部分 view functionset(自己 ...

最新文章

  1. 候选翻译文章列表[示范]
  2. 2014年工作中遇到的10个问题:221-230
  3. 编译安装samba4.89遇到的错误
  4. 电脑已连接wifi的密码查询
  5. Destroying the bus stations
  6. Ubuntu环境搭建
  7. 测试结果表明开车打手机比酒后开车更危险
  8. Google Maps API 调用实例
  9. 重磅出击,体验Win2008 Hyper-V(下)
  10. Java线程池ThreadPoolExecutor源码分析
  11. springboot里面的porm配置问题
  12. java 名称可以包含-吗_java – 验证失败时包含参数名称的自定义...
  13. 通过JLINK下载程序(附JLINK驱动)
  14. 无线传感网学习笔记(5)—— MAC协议的设计目标 和 LEACH协议
  15. Visio 流程图的箭头 设置
  16. 2022年版中国石油焦市场运行现状调研与前景动态分析报告
  17. 异构符号网络上的情感链接预测——SHINE
  18. MQTT:QoS服务质量 0,1,2(Quality of Service 0, 1 2)
  19. 第二弹!python爬虫批量下载高清大图
  20. Vatti clipping 算法介绍

热门文章

  1. pandas插入新列
  2. 题解-bzoj3901 棋盘游戏
  3. 观察者模式在android网络监控下的运用
  4. JVM 一套卷,助你快速掌握优化法则
  5. python3 pygame 坦克自动移动
  6. centos7 环境搭建(LNMP)以及虚拟环境(python3)
  7. MVC控制器中动作方法返回的结果
  8. 去除input填充颜色
  9. jmeter压测前清理内存
  10. Java 学习笔记(121208)