FTP可以上传文件
This commit is contained in:
@@ -25,7 +25,7 @@
|
||||
#define CH395F_RESET_DELAY_MS 20U /* 复位后等待延时(ms<6D>?*/
|
||||
#define CH395F_INIT_TIMEOUT_MS 500U /* 初始化超时时间(ms<6D>?*/
|
||||
#define CH395F_SPI_BEGIN_DELAY_MS 1U /* SPI 事务开始延时(ms<6D>?*/
|
||||
#define CH395F_DMA_BUF_SIZE 1500U /* DMA 缓冲区最大字节数 */
|
||||
#define CH395F_DMA_BUF_SIZE 4100U /* DMA 缓冲区(header 4 + max 4096 data) */
|
||||
|
||||
/*
|
||||
* 私有变量<E58F98>?- DMA 传输相关
|
||||
|
||||
@@ -182,11 +182,14 @@ static int receive_file(int socket, const char *path)
|
||||
return -1;
|
||||
}
|
||||
|
||||
unsigned char buffer[1024];
|
||||
static unsigned char s_recv_buf[4096];
|
||||
int bufsize = 4096;
|
||||
int err;
|
||||
int total = 0;
|
||||
|
||||
while ((err = lftpd_inet_read(socket, buffer, sizeof(buffer))) > 0) {
|
||||
if (lftpd_io_write(fh, buffer, err) != err) {
|
||||
while ((err = lftpd_inet_read(socket, s_recv_buf, bufsize)) > 0) {
|
||||
total += err;
|
||||
if (lftpd_io_write(fh, s_recv_buf, err) != err) {
|
||||
err = -1;
|
||||
break;
|
||||
}
|
||||
@@ -197,6 +200,11 @@ static int receive_file(int socket, const char *path)
|
||||
if (err < 0) {
|
||||
return err;
|
||||
}
|
||||
if (total == 0) {
|
||||
lftpd_log_error("received 0 bytes");
|
||||
lftpd_io_unlink(path);
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -209,18 +217,15 @@ static int cmd_cwd(lftpd_client_t *client, const char *arg)
|
||||
|
||||
char *path = lftpd_io_canonicalize_path(client->directory, arg);
|
||||
|
||||
uint32_t size;
|
||||
int is_dir;
|
||||
if (lftpd_io_stat(path, &size, &is_dir) != 0) {
|
||||
send_simple_response(client->socket, 550, STATUS_550);
|
||||
free(path);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (!is_dir) {
|
||||
send_simple_response(client->socket, 550, STATUS_550);
|
||||
free(path);
|
||||
return -1;
|
||||
/* 根目录始终有效,跳过 stat 检查(FatFS FF_FS_RPATH=0 下 stat 根目录可能失败) */
|
||||
if (strcmp(path, "/") != 0) {
|
||||
uint32_t size;
|
||||
int is_dir;
|
||||
if (lftpd_io_stat(path, &size, &is_dir) != 0 || !is_dir) {
|
||||
send_simple_response(client->socket, 550, STATUS_550);
|
||||
free(path);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
strncpy(client->directory, path, sizeof(client->directory) - 1);
|
||||
@@ -262,6 +267,11 @@ static int cmd_dele(lftpd_client_t *client, const char *arg)
|
||||
|
||||
static int cmd_epsv(lftpd_client_t *client, const char *arg)
|
||||
{
|
||||
if (client->data_socket >= 0) {
|
||||
lftpd_inet_close(client->data_socket);
|
||||
client->data_socket = -1;
|
||||
}
|
||||
|
||||
int listener_socket = lftpd_inet_listen(0);
|
||||
if (listener_socket < 0) {
|
||||
send_simple_response(client->socket, 425, STATUS_425);
|
||||
@@ -272,16 +282,9 @@ static int cmd_epsv(lftpd_client_t *client, const char *arg)
|
||||
|
||||
send_simple_response(client->socket, 229, STATUS_229, port);
|
||||
|
||||
lftpd_log_debug("waiting for data port connection on port %d...", port);
|
||||
int data_sock = lftpd_inet_accept(listener_socket);
|
||||
if (data_sock < 0) {
|
||||
lftpd_log_error("error accepting client socket");
|
||||
lftpd_inet_close(listener_socket);
|
||||
return -1;
|
||||
}
|
||||
lftpd_log_debug("data port connection received...");
|
||||
lftpd_log_debug("EPSV listener on port %d", port);
|
||||
|
||||
client->data_socket = data_sock;
|
||||
client->data_socket = listener_socket;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -304,8 +307,17 @@ static int cmd_list(lftpd_client_t *client, const char *arg)
|
||||
}
|
||||
|
||||
send_simple_response(client->socket, 150, STATUS_150);
|
||||
int err = send_list(client->data_socket, client->directory);
|
||||
lftpd_inet_close(client->data_socket);
|
||||
int data_sock = lftpd_inet_accept_timeout(client->data_socket, 5000);
|
||||
if (data_sock < 0) {
|
||||
lftpd_log_error("%s accept failed, sk=%d", __func__, client->data_socket);
|
||||
send_simple_response(client->socket, 425, STATUS_425);
|
||||
lftpd_inet_close(client->data_socket);
|
||||
client->data_socket = -1;
|
||||
return -1;
|
||||
}
|
||||
|
||||
int err = send_list(data_sock, client->directory);
|
||||
lftpd_inet_close(data_sock);
|
||||
client->data_socket = -1;
|
||||
|
||||
if (err == 0) {
|
||||
@@ -324,8 +336,17 @@ static int cmd_nlst(lftpd_client_t *client, const char *arg)
|
||||
}
|
||||
|
||||
send_simple_response(client->socket, 150, STATUS_150);
|
||||
int err = send_nlst(client->data_socket, client->directory);
|
||||
lftpd_inet_close(client->data_socket);
|
||||
int data_sock = lftpd_inet_accept_timeout(client->data_socket, 5000);
|
||||
if (data_sock < 0) {
|
||||
lftpd_log_error("%s accept failed, sk=%d", __func__, client->data_socket);
|
||||
send_simple_response(client->socket, 425, STATUS_425);
|
||||
lftpd_inet_close(client->data_socket);
|
||||
client->data_socket = -1;
|
||||
return -1;
|
||||
}
|
||||
|
||||
int err = send_nlst(data_sock, client->directory);
|
||||
lftpd_inet_close(data_sock);
|
||||
client->data_socket = -1;
|
||||
|
||||
if (err == 0) {
|
||||
@@ -353,6 +374,11 @@ static int cmd_pasv(lftpd_client_t *client, const char *arg)
|
||||
int listener_socket = -1;
|
||||
int retry;
|
||||
|
||||
if (client->data_socket >= 0) {
|
||||
lftpd_inet_close(client->data_socket);
|
||||
client->data_socket = -1;
|
||||
}
|
||||
|
||||
for (retry = 0; retry < 3; retry++) {
|
||||
listener_socket = lftpd_inet_listen(0);
|
||||
if (listener_socket >= 0) break;
|
||||
@@ -386,16 +412,9 @@ static int cmd_pasv(lftpd_client_t *client, const char *arg)
|
||||
(port >> 8) & 0xff, (port >> 0) & 0xff);
|
||||
}
|
||||
|
||||
lftpd_log_debug("waiting for data port connection on port %d...", port);
|
||||
int data_sock = lftpd_inet_accept(listener_socket);
|
||||
if (data_sock < 0) {
|
||||
lftpd_log_error("error accepting client socket");
|
||||
lftpd_inet_close(listener_socket);
|
||||
return -1;
|
||||
}
|
||||
lftpd_log_debug("data port connection received...");
|
||||
lftpd_log_debug("PASV listener on port %d", port);
|
||||
|
||||
client->data_socket = data_sock;
|
||||
client->data_socket = listener_socket;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -419,18 +438,29 @@ static int cmd_retr(lftpd_client_t *client, const char *arg)
|
||||
}
|
||||
|
||||
send_simple_response(client->socket, 150, STATUS_150);
|
||||
int data_sock = lftpd_inet_accept_timeout(client->data_socket, 5000);
|
||||
if (data_sock < 0) {
|
||||
lftpd_log_error("%s accept failed, sk=%d", __func__, client->data_socket);
|
||||
send_simple_response(client->socket, 425, STATUS_425);
|
||||
lftpd_inet_close(client->data_socket);
|
||||
client->data_socket = -1;
|
||||
return -1;
|
||||
}
|
||||
|
||||
char *path = lftpd_io_canonicalize_path(client->directory, arg);
|
||||
lftpd_log_debug("send '%s'", path);
|
||||
int err = send_file(client->data_socket, path);
|
||||
free(path);
|
||||
lftpd_inet_close(client->data_socket);
|
||||
int err = send_file(data_sock, path);
|
||||
lftpd_inet_close(data_sock);
|
||||
client->data_socket = -1;
|
||||
|
||||
if (err == 0) {
|
||||
lftpd_log_info("DOWNLOAD '%s' OK", path);
|
||||
send_simple_response(client->socket, 226, STATUS_226);
|
||||
} else {
|
||||
lftpd_log_error("DOWNLOAD '%s' FAILED", path);
|
||||
send_simple_response(client->socket, 450, STATUS_450);
|
||||
}
|
||||
free(path);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -464,18 +494,32 @@ static int cmd_stor(lftpd_client_t *client, const char *arg)
|
||||
}
|
||||
|
||||
send_simple_response(client->socket, 150, STATUS_150);
|
||||
int data_sock = lftpd_inet_accept_timeout(client->data_socket, 5000);
|
||||
if (data_sock < 0) {
|
||||
lftpd_log_error("%s accept failed, sk=%d", __func__, client->data_socket);
|
||||
send_simple_response(client->socket, 425, STATUS_425);
|
||||
lftpd_inet_close(client->data_socket);
|
||||
client->data_socket = -1;
|
||||
return -1;
|
||||
}
|
||||
|
||||
char *path = lftpd_io_canonicalize_path(client->directory, arg);
|
||||
lftpd_log_debug("receive '%s'", path);
|
||||
int err = receive_file(client->data_socket, path);
|
||||
free(path);
|
||||
lftpd_inet_close(client->data_socket);
|
||||
int err = receive_file(data_sock, path);
|
||||
lftpd_inet_close(data_sock);
|
||||
client->data_socket = -1;
|
||||
|
||||
if (err == 0) {
|
||||
uint32_t size = 0;
|
||||
int is_dir = 0;
|
||||
lftpd_io_stat(path, &size, &is_dir);
|
||||
lftpd_log_info("UPLOAD '%s' %lu bytes OK", path, (unsigned long)size);
|
||||
send_simple_response(client->socket, 226, STATUS_226);
|
||||
} else {
|
||||
lftpd_log_error("UPLOAD '%s' FAILED", path);
|
||||
send_simple_response(client->socket, 450, STATUS_450);
|
||||
}
|
||||
free(path);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -548,6 +592,7 @@ static int handle_control_channel(lftpd_client_t *client)
|
||||
arg = lftpd_string_trim(arg_buf);
|
||||
}
|
||||
|
||||
lftpd_log_info("CMD %s %s", command_tmp, arg ? arg : "");
|
||||
err = commands[i].handler(client, arg);
|
||||
matched = true;
|
||||
break;
|
||||
@@ -585,7 +630,7 @@ int lftpd_start(const char *directory, int port, lftpd_t *lftpd)
|
||||
if (client_socket < 0) {
|
||||
lftpd_log_error("error accepting client socket");
|
||||
lftpd_inet_close(lftpd->server_socket);
|
||||
break;
|
||||
continue;
|
||||
}
|
||||
|
||||
{
|
||||
@@ -614,14 +659,9 @@ int lftpd_start(const char *directory, int port, lftpd_t *lftpd)
|
||||
handle_control_channel(&client);
|
||||
lftpd->client = NULL;
|
||||
|
||||
/* 等待 CH395F 稳定(Trap 09) */
|
||||
vTaskDelay(pdMS_TO_TICKS(200));
|
||||
|
||||
/* standalone mode: socket was closed in handle_control_channel,
|
||||
* loop back to create a new listener */
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int lftpd_stop(lftpd_t *lftpd)
|
||||
|
||||
@@ -7,30 +7,40 @@
|
||||
|
||||
int lftpd_inet_listen(int port)
|
||||
{
|
||||
int s = net_socket(NET_AF_INET, NET_SOCK_STREAM, 0);
|
||||
if (s < 0) {
|
||||
DBG_ERROR("error creating listener socket");
|
||||
return -1;
|
||||
}
|
||||
int retry;
|
||||
int s;
|
||||
|
||||
struct net_sockaddr_in addr;
|
||||
addr.sin_family = NET_AF_INET;
|
||||
addr.sin_port = net_htons((uint16_t)port);
|
||||
addr.sin_addr.s_addr = 0;
|
||||
for (retry = 0; retry < 5; retry++) {
|
||||
s = net_socket(NET_AF_INET, NET_SOCK_STREAM, 0);
|
||||
if (s < 0) {
|
||||
if (retry == 0) DBG_ERROR("create socket");
|
||||
vTaskDelay(pdMS_TO_TICKS(500));
|
||||
continue;
|
||||
}
|
||||
|
||||
struct net_sockaddr_in addr;
|
||||
addr.sin_family = NET_AF_INET;
|
||||
addr.sin_port = net_htons((uint16_t)port);
|
||||
addr.sin_addr.s_addr = 0;
|
||||
|
||||
if (net_bind(s, (struct net_sockaddr *)&addr, sizeof(addr)) < 0) {
|
||||
DBG_ERROR("bind port %d", port);
|
||||
net_close(s);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (net_listen(s, 0) >= 0) {
|
||||
return s;
|
||||
}
|
||||
|
||||
if (net_bind(s, (struct net_sockaddr *)&addr, sizeof(addr)) < 0) {
|
||||
DBG_ERROR("error binding listener port %d", port);
|
||||
net_close(s);
|
||||
return -1;
|
||||
if (retry < 4) {
|
||||
vTaskDelay(pdMS_TO_TICKS(2000));
|
||||
}
|
||||
}
|
||||
|
||||
if (net_listen(s, 0) < 0) {
|
||||
DBG_ERROR("error listening on socket");
|
||||
net_close(s);
|
||||
return -1;
|
||||
}
|
||||
|
||||
return s;
|
||||
DBG_ERROR("listen failed after 5 retries (total 10s wait)");
|
||||
return -1;
|
||||
}
|
||||
|
||||
int lftpd_inet_listen_multi(int port, int backlog)
|
||||
@@ -81,10 +91,33 @@ int lftpd_inet_accept(int socket)
|
||||
if (s >= 0) {
|
||||
return s;
|
||||
}
|
||||
vTaskDelay(pdMS_TO_TICKS(10));
|
||||
vTaskDelay(pdMS_TO_TICKS(100));
|
||||
}
|
||||
}
|
||||
|
||||
int lftpd_inet_accept_timeout(int socket, int timeout_ms)
|
||||
{
|
||||
int elapsed = 0;
|
||||
|
||||
while (elapsed < timeout_ms) {
|
||||
int s = net_accept(socket, NULL, NULL);
|
||||
if (s >= 0) {
|
||||
return s;
|
||||
}
|
||||
/* 数据连接已被对端关闭时提前退出,不等待超时 */
|
||||
net_sock_t *p_sock = net_get_sock(socket);
|
||||
if (p_sock == NULL || p_sock->state != NET_SOCK_STATE_LISTENING) {
|
||||
DBG_ERROR("data socket closed, accept aborted");
|
||||
return -1;
|
||||
}
|
||||
vTaskDelay(pdMS_TO_TICKS(100));
|
||||
elapsed += 100;
|
||||
}
|
||||
|
||||
DBG_ERROR("accept timeout (%dms)", timeout_ms);
|
||||
return -1;
|
||||
}
|
||||
|
||||
int lftpd_inet_read_line(int socket, char *buffer, size_t buffer_len)
|
||||
{
|
||||
memset(buffer, 0, buffer_len);
|
||||
|
||||
@@ -11,17 +11,17 @@
|
||||
|
||||
/*
|
||||
* FatFS 在 FF_USE_LFN=0 时不接受 "/" 前缀路径。
|
||||
* 剥离前导 "/" 后用 FatFS 兼容路径,根目录用 "." 替代空字符串。
|
||||
* 剥离前导 "/" 后用 FatFS 兼容路径,根目录用 "0:"(驱动号格式)替代。
|
||||
*/
|
||||
static const char *to_fatfs_path(const char *path)
|
||||
{
|
||||
if (path == NULL || *path == '\0') {
|
||||
return ".";
|
||||
return "0:";
|
||||
}
|
||||
if (*path == '/') {
|
||||
path++;
|
||||
if (*path == '\0') {
|
||||
return ".";
|
||||
return "0:";
|
||||
}
|
||||
}
|
||||
return path;
|
||||
|
||||
@@ -7,6 +7,7 @@ int lftpd_inet_listen(int port);
|
||||
int lftpd_inet_listen_multi(int port, int backlog);
|
||||
int lftpd_inet_get_socket_port(int socket);
|
||||
int lftpd_inet_accept(int socket);
|
||||
int lftpd_inet_accept_timeout(int socket, int timeout_ms);
|
||||
int lftpd_inet_read_line(int socket, char *buffer, size_t buffer_len);
|
||||
int lftpd_inet_write_string(int socket, const char *message);
|
||||
int lftpd_inet_write(int socket, const void *buf, int len);
|
||||
|
||||
@@ -66,7 +66,7 @@ extern "C" {
|
||||
#endif
|
||||
|
||||
#ifndef NET_RECV_TIMEOUT_MS
|
||||
#define NET_RECV_TIMEOUT_MS 0 /* 接收超时(0=无限等待) */
|
||||
#define NET_RECV_TIMEOUT_MS 30000 /* 接收超时(30秒,0=无限等待) */
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
||||
@@ -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