基于 TCP 协议的简易 FTP 客户端 - 服务器系统
这个程序是基于FTP 的 “双连接模型”(控制连接 + 数据连接),支持用户认证、目录列表查看(list)、文件下载(get)和连接退出(quit)核心功能。代码分为三个核心模块:common公共工具层、ftclient客户端层、ftserve服务器层,以下从模块拆分、功能流程、关键技术、优缺点四个维度详细分析。
一、整体架构与模块依赖
代码采用分层设计,各模块职责清晰,依赖关系如下:
common模块(公共工具)
├─ 提供socket基础操作、数据收发、字符串处理等通用函数
├─ 定义全局常量(如MAXSIZE、CLIENT_PORT_ID)和结构体(struct command)
└─ 被ftclient和ftserve模块依赖(通过#include "common.h")
ftclient模块(客户端)
├─ 依赖common模块的工具函数
├─ 实现用户交互、控制连接建立、命令发送、数据接收(目录/文件)
└─ 头文件ftclient.h声明客户端专属函数
ftserve模块(服务器)
├─ 依赖common模块的工具函数
├─ 实现监听连接、用户认证、命令解析、数据发送(目录/文件)
└─ 头文件ftserve.h声明服务器专属函数
二、模块详细分析
1. common 模块:公共工具层
common.h和对应的实现代码封装了网络编程基础操作和通用工具函数,是客户端和服务器的核心依赖,避免代码重复。
1.1 核心常量与结构体
| 常量 / 结构体 | 含义与作用 |
|---|---|
DEBUG = 1 |
调试开关(当前未实际使用,预留扩展) |
MAXSIZE = 512 |
缓冲区最大长度(符合 FTP 协议的默认数据块大小) |
CLIENT_PORT_ID = 30020 |
客户端固定数据端口(用于 FTP 主动模式,服务器主动连接此端口传输数据) |
struct command |
存储解析后的 FTP 命令:code[5](命令码,如 LIST/RETR)、arg[255](命令参数,如文件名) |
1.2 核心工具函数(按功能分类)
(1)Socket 基础操作(网络核心)
| 函数原型 | 功能描述 | 关键细节 |
|---|---|---|
int socket_create(int port) |
创建并初始化监听 socket(绑定端口、设置地址重用、开始监听) | 1. 用socket(AF_INET, SOCK_STREAM, 0)创建 TCP socket;2. SO_REUSEADDR选项:允许端口释放后快速重用(避免 “地址已在使用” 错误);3. 绑定 INADDR_ANY(监听所有网卡的请求);4. 监听队列长度 5(最多同时处理 5 个等待连接)。 |
int socket_accept(int sock_listen) |
接受客户端连接请求,返回通信 socket | 1. 阻塞等待客户端连接; 2. 存储客户端地址到 |






