实验大作业c语言实现简单ftp,C 语言实现 FTP 服务器
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 服务器相关推荐
- 西工大数据库实验大作业 火锅店菜品管理系统
西工大数据库实验大作业 火锅店菜品管理系统 文章目录 西工大数据库实验大作业 火锅店菜品管理系统 前言: 一.大作业简单的需求分析: 二.数据流图: 三.数据字典: 四.E-R图: 五.关系模式设计: ...
- 基于eNSP的IPv4加IPv6的企业/校园网络规划设计(综合实验/大作业)
作者:BSXY_19计科_陈永跃 BSXY_信息学院_名片v位于结尾处 注:未经允许禁止转发任何内容 基于eNSP的IPv4加IPv6的企业/校园网络规划设计_综合实验/大作业 前言及技术/资源下载说 ...
- 江南大学C语言大作业,TCPIP大作业基于TCP的网络通信编程C语言版(江南大学).doc...
TCPIP大作业基于TCP的网络通信编程C语言版(江南大学).doc TCP/IP协议编程大作业 课题名称 基于TCP的网络通信 专 业 计算机科学与技术 班 级 计算机1206 学 号 103041 ...
- 象棋快棋赛电子裁判计时器的设计——《数字逻辑与数字系统设计》实验大作业设计报告
数电Github资源 <数字逻辑与数字系统设计>实验大作业设计报告 实验题目 象棋快棋赛电子裁判计时器的设计 实验难度 ★★ 成员 姓名 班号 学号 1 郭茁宁 1837101 11837 ...
- HTML5期末大作业:红酒主题——简单的品牌红酒销售网页设计(4页) HTML+CSS+JavaScript 期末大作业HTML代码
HTML5期末大作业:红酒主题--简单的品牌红酒销售网页设计(4页) HTML+CSS+JavaScript 期末作业HTML代码 学生网页课程设计期末大作业下载 web网页设计制作成品 常见网页设计 ...
- 数字图像处理课程(作业+实验+大作业)相关文章 传送门
数字图像处理课程(作业+实验+大作业)相关文章 传送门 博文说明 本文所使用代码或多或少参考了以往博文的同类or相似文章的代码,并非纯原创 本文仅用于记录并提供一种代码思路,供大家参考 文章目录 数字 ...
- matlab数学实验 南邮,matlab实验练习题(计算机)-南邮-matlab-数学实验大作业答案
matlab实验练习题(计算机)-南邮-matlab-数学实验大作业答案 1"MATLAB"练习题练习题要求:抄题.写出操作命令.运行结果,并根据要求,贴上运行图.1.求的所有根. ...
- 哈工大(威海)算法实验一:分治算法实验大作业
哈工大(威海)算法实验一:分治算法实验大作业 题目 某一高等院校有汽车学院.材料学院.计算机学院.软件学院:每个学院的一年级第一学期都开英语.高数.线代课程.每个学院每学期的成绩已经分别登录在同一个E ...
- 大一c语言大作业课题大全,昆明理工大学大一C语言大作业题目.doc
昆明理工大学大一C语言大作业题目 综合性实践排序求平均值(包括将数拆散求最大最小值).函数ReadDat()随机产生100个存放到数组aa中00个jsSort()函数的功能是:进行降序排列.最后调用函 ...
- 数据结构实验大作业(将之前预测ACM获奖的模型搬到Vue和django上)
目录 前言 成品展示(UI写的确实有点糊弄,太懒了不想弄了) Vue部分 App.vue(中间感觉还行,不算难看) result组件: 路由: Django部分 view functionset(自己 ...
最新文章
- 候选翻译文章列表[示范]
- 2014年工作中遇到的10个问题:221-230
- 编译安装samba4.89遇到的错误
- 电脑已连接wifi的密码查询
- Destroying the bus stations
- Ubuntu环境搭建
- 测试结果表明开车打手机比酒后开车更危险
- Google Maps API 调用实例
- 重磅出击,体验Win2008 Hyper-V(下)
- Java线程池ThreadPoolExecutor源码分析
- springboot里面的porm配置问题
- java 名称可以包含-吗_java – 验证失败时包含参数名称的自定义...
- 通过JLINK下载程序(附JLINK驱动)
- 无线传感网学习笔记(5)—— MAC协议的设计目标 和 LEACH协议
- Visio 流程图的箭头 设置
- 2022年版中国石油焦市场运行现状调研与前景动态分析报告
- 异构符号网络上的情感链接预测——SHINE
- MQTT:QoS服务质量 0,1,2(Quality of Service 0, 1 2)
- 第二弹!python爬虫批量下载高清大图
- Vatti clipping 算法介绍