FTP可以上传文件
This commit is contained in:
@@ -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 独立工作,支持多监听 Socket(FTP 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) {
|
||||
|
||||
Reference in New Issue
Block a user