FTP可以上传文件

This commit is contained in:
2026-07-22 01:46:29 +08:00
parent 038a2542af
commit c646df5c2a
76 changed files with 851 additions and 172 deletions

View File

@@ -286,3 +286,84 @@ msg.result = (int)notified;
- 指针成员(`msg.buf`不受值拷贝影响——netTask 拿到的是同一个指针,可以读写调用方的缓冲区
- `net_connect()` 不使用消息队列(在 netTask 内直接调用 `_locked` 版本),不受此 bug 影响
- 内核级 API`net_send_sock` / `net_recv_sock` / `net_listen_locked`)直接操作,同样不受影响
---
## Trap 11`net_accept_locked` 拒绝 standalone_accept 的 ESTABLISHED 状态
### 现象
FTP 客户端 TCP 连接成功standalone accept220 欢迎语不发送,`lftpd_inet_accept()` 死循环。客户端连接成功但永远收不到任何 FTP 响应。
### 根因
`net_accept_locked()` 入口检查:
```c
if (p_listen_sock->state != NET_SOCK_STATE_LISTENING) {
return -1; // ← 直接拒绝!
}
```
standalone accept 后 state 已变为 `ESTABLISHED`,永远到不了后续的 `standalone_accept` 检查——死锁。
### 解决方案
```c
if (p_listen_sock->state != NET_SOCK_STATE_LISTENING &&
!(p_listen_sock->standalone_accept && p_listen_sock->state == NET_SOCK_STATE_ESTABLISHED)) {
return -1;
}
```
允许 `standalone_accept + ESTABLISHED` 组合通过。
### 注意事项
- 不影响多连接模式(多连接监听 Socket 状态始终为 LISTENING由数据 Socket 承载连接)
- 仅影响 standalone_accept 模式PASV 数据通道、单连接 FTP
---
## Trap 12FatFS `FF_USE_LFN=0` + 路径 `/` 前缀 → `FR_INVALID_NAME`
### 现象
FTP STOR 上传文件时 `f_open("/upload_test.txt", FA_WRITE | FA_CREATE_ALWAYS)` 返回 `err=6`FR_INVALID_NAME`upload_test.txt` 文件名 11+3 字符 > 8.3 限制同样触发 err=6。
### 根因
1. `ffconf.h``FF_USE_LFN = 0`(长文件名禁用),最大文件名 8+3 字符
2. FatFS 不接受 `/file` 格式的路径(需要 `file``0:file`
3. `lftpd_io_canonicalize_path("/", "file")` 输出必然带 `/` 前缀
4. 根目录路径 `"/"` 剥离后为空字符串,`f_stat("")` 同样失败
### 解决方案
```c
/* 剥离 "/" 前缀,根目录用 "." 表示 */
static const char *to_fatfs_path(const char *path) {
if (path == NULL || *path == '\0') return ".";
if (*path == '/') {
path++;
if (*path == '\0') return ".";
}
return path;
}
```
所有 `lftpd_io_*` 函数调用 FatFS 前统一使用 `to_fatfs_path(path)`
### 注意事项
- 长文件名需设置 `FF_USE_LFN = 1` 并配置 `FF_LFN_UNICODE`,会显著增加 RAM 占用
- `CWD .``CWD /` 同样受此问题影响,修复后正常工作
---
## 附FTP 支持改造完整问题清单
| # | 问题 | 类型 | 修复位置 |
|---|------|------|----------|
| 1 | 消息队列值拷贝6 个 API 永远返回 -1 | Trap 10 | `net_socket.c` |
| 2 | PHY link up 后 open_socket 失败 | Trap 09 | `freertos.c` + `lftpd.c` |
| 3 | `net_accept_locked` 拒绝 ESTABLISHED | Trap 11 | `net_socket.c` |
| 4 | CH395F 多连接模式不支持多监听 | 架构 | `net_socket.c: fun_para=0x00` |
| 5 | PASV 端口 0net_bind 无自动分配) | 缺功能 | `net_socket.c: s_dynamic_port` |
| 6 | FatFS 路径 `/` 不兼容 + LFN 禁用 | Trap 12 | `lftpd_io.c: to_fatfs_path()` |
| 7 | `cmd_pasv` 连关连开 listen 失败 | Trap 09 子类 | `lftpd.c: 3次重试` |
| 8 | `ftpTask` 启动时 PHY 未稳定 | Trap 09 子类 | `freertos.c: osDelay(7000)` |
| 9 | 会话结束后立即重建监听失败 | Trap 09 子类 | `lftpd.c: vTaskDelay(200ms)` |
| 10 | `s_file_open` 单文件限制 | 已知限制 | `lftpd_io.c` (全局变量) |