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

@@ -107,8 +107,8 @@ int net_init(const char *ip, const char *mask, const char *gateway) {
ch395f_reset();
DBG_INFO("net_init: set_fun_para...");
/* 启用单连接模式:每个 Socket 独立工作,支持多监听 SocketFTP PASV 需要) */
ch395f_set_fun_para(0x00);
/* CH395F 超时/DISCONNECT 后不要自动关闭 Socket由软件手动管理 */
ch395f_set_fun_para(0x08);
DBG_INFO("net_init: set_tcp_mss...");
/* 设置 TCP MSS */
@@ -224,6 +224,7 @@ int net_poll(void) {
/* 读取 Socket 中断状<E696AD>?*/
uint8_t sock_int = ch395f_get_sock_int_status(i);
DBG_INFO("s%d int=0x%02X", i, sock_int);
/* 连接事件 */
if (sock_int & CH395F_SINT_STAT_CONNECT) {
@@ -520,13 +521,23 @@ int net_listen_locked(int sockfd, int backlog) {
}
}
/* 配置监听 Socket */
ch395f_set_send_buf((uint8_t)sockfd, 0, 2);
ch395f_set_recv_buf((uint8_t)sockfd, 2, 2);
/* 配置监听 Socket:单连接模式使用 CH395F 默认缓冲区socket 0-3 已互不重叠),
* 多连接模式显式分配socket 4-7 默认无缓冲区)*/
if (backlog > 0) {
uint8_t base = (uint8_t)(sockfd * 4);
ch395f_set_send_buf((uint8_t)sockfd, base, 2);
ch395f_set_recv_buf((uint8_t)sockfd, base + 2, 2);
}
ch395f_set_proto_type(sockfd, CH395F_PROTO_TYPE_TCP);
ch395f_set_sour_port(sockfd, p_sock->local_port);
status = ch395f_open_socket(sockfd);
/* CH395F 关 socket 后需要时间才能重新打开,重试 3 次Trap 09 */
for (int open_try = 0; open_try < 3; open_try++) {
status = ch395f_open_socket(sockfd);
if (status == CH395F_ERR_SUCCESS) break;
ch395f_close_socket(sockfd);
HAL_Delay(500);
}
if (status != CH395F_ERR_SUCCESS) {
s_net_errno = NET_ERR_BUSY;
return -1;
@@ -840,8 +851,10 @@ static int net_recv_locked(net_sock_t *p_sock, void *buf, int len, int flags) {
recv_len = ch395f_get_recv_len(sockfd);
if (recv_len > 0) {
int read_len = (recv_len > (uint16_t)len) ? len : (int)recv_len;
DBG_INFO("recv sock%d len=%d", sockfd, recv_len);
ch395f_read_recv_buf(sockfd, (uint8_t *)buf, (uint16_t)read_len);
p_sock->recv_bytes += (uint32_t)read_len;
HAL_Delay(1); /* 等待 CH395F 刷新 recv_len 寄存器 */
return read_len;
}
@@ -856,7 +869,8 @@ static int net_recv_locked(net_sock_t *p_sock, void *buf, int len, int flags) {
return -1;
}
if (p_sock->state == NET_SOCK_STATE_TCP_ACCEPT) {
if (p_sock->state == NET_SOCK_STATE_TCP_ACCEPT ||
p_sock->state == NET_SOCK_STATE_CLOSED) {
return 0;
}
}
@@ -1390,7 +1404,8 @@ static void handle_connect_event(net_sock_t *p_sock) {
p_sock->state = NET_SOCK_STATE_ESTABLISHED;
p_sock->send_ready = 1;
ch395f_set_keepalive_enable(p_sock->ch395_sock, 1);
/* 清除残留的 TIMEOUT 中断标志 */
(void)ch395f_get_sock_int_status(p_sock->ch395_sock);
fire_event(p_sock, NET_EVENT_CONNECTED);
} else {
@@ -1465,18 +1480,29 @@ static void handle_disconnect_event(net_sock_t *p_sock) {
DBG_ERROR("WARNING: listen sock%d got disconnect", p_sock->ch395_sock);
}
else if (p_sock->state == NET_SOCK_STATE_ESTABLISHED) {
/* CH395F 自动关闭<E585B3>?Socket恢复为未使用状<E794A8>?*/
DBG_INFO("sock%d DISCONNECTED, back to idle", p_sock->ch395_sock);
memset(p_sock->remote_ip_arr, 0, 4);
p_sock->remote_port = 0;
p_sock->send_ready = 1;
p_sock->state = NET_SOCK_STATE_TCP_ACCEPT;
fire_event(p_sock, NET_EVENT_DISCONNECTED);
if (p_sock->standalone_accept) {
/* 独立监听模式PASV 数据通道):通知断开但不释放 Socket
* 留给传输命令STOR/LIST的 accept 检测 CLOSED 状态后统一清理。
* 但必须先关闭 CH395F 硬件 Socket否则后续 ch395f_open_socket 失败 */
DBG_INFO("sock%d DISCONNECTED, releasing", p_sock->ch395_sock);
ch395f_close_socket(p_sock->ch395_sock);
p_sock->state = NET_SOCK_STATE_CLOSED;
fire_event(p_sock, NET_EVENT_DISCONNECTED);
} else {
DBG_INFO("sock%d DISCONNECTED, back to idle", p_sock->ch395_sock);
memset(p_sock->remote_ip_arr, 0, 4);
p_sock->remote_port = 0;
p_sock->send_ready = 1;
p_sock->state = NET_SOCK_STATE_TCP_ACCEPT;
fire_event(p_sock, NET_EVENT_DISCONNECTED);
}
} else if (p_sock->state == NET_SOCK_STATE_TCP_ACCEPT) {
memset(p_sock->remote_ip_arr, 0, 4);
p_sock->remote_port = 0;
p_sock->send_ready = 1;
} else if (p_sock->state != NET_SOCK_STATE_CLOSED) {
} else if (p_sock->state != NET_SOCK_STATE_CLOSED &&
p_sock->state != NET_SOCK_STATE_BOUND &&
p_sock->state != NET_SOCK_STATE_CREATED) {
/* 未预期的断开 */
DBG_ERROR("sock%d disconnect in state %d", p_sock->ch395_sock, p_sock->state);
fire_event(p_sock, NET_EVENT_DISCONNECTED);
@@ -1509,19 +1535,10 @@ static void handle_timeout_event(net_sock_t *p_sock) {
}
else if (p_sock->state == NET_SOCK_STATE_ESTABLISHED) {
if (p_sock->standalone_accept) {
/* 独立监听模式PASV断开后释放 Socket不清零整个控制块net_recv 中的任务仍需读 state */
DBG_INFO("sock%d DISCONNECTED, releasing", p_sock->ch395_sock);
p_sock->state = NET_SOCK_STATE_CLOSED;
p_sock->in_use = 0;
fire_event(p_sock, NET_EVENT_DISCONNECTED);
DBG_INFO("sock%d TIMEOUT (ignored)", p_sock->ch395_sock);
} else {
/* CH395F 自动关闭了 Socket恢复为未使用状态 */
DBG_INFO("sock%d DISCONNECTED, back to idle", p_sock->ch395_sock);
memset(p_sock->remote_ip_arr, 0, 4);
p_sock->remote_port = 0;
p_sock->send_ready = 1;
DBG_ERROR("sock%d TIMEOUT", p_sock->ch395_sock);
p_sock->state = NET_SOCK_STATE_TCP_ACCEPT;
fire_event(p_sock, NET_EVENT_DISCONNECTED);
}
}
else if (p_sock->state == NET_SOCK_STATE_LISTENING) {