From 95e7f42aa2d598e76f82923cf0cc625c2251b8be Mon Sep 17 00:00:00 2001 From: Wanderingss <1624155937@qq.com> Date: Thu, 24 Sep 2026 17:14:12 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=8F=91=E9=80=81=E4=B8=AD?= =?UTF-8?q?=E9=80=94=E6=96=AD=E8=BF=9E=E7=A9=BA=E7=AD=891s=EF=BC=9Asend?= =?UTF-8?q?=E7=AD=89=E5=BE=85=E5=BE=AA=E7=8E=AF=E5=8A=A0=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E6=A3=80=E6=9F=A5=EF=BC=8C=E6=96=AD=E8=BF=9E=E7=AB=8B=E5=8D=B3?= =?UTF-8?q?=E5=A4=B1=E8=B4=A5=E5=9B=9E=E4=BC=A0CONNRESET?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Drivers/BSP/NET/net_socket.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/Drivers/BSP/NET/net_socket.c b/Drivers/BSP/NET/net_socket.c index c6e590c5..d43b8018 100644 --- a/Drivers/BSP/NET/net_socket.c +++ b/Drivers/BSP/NET/net_socket.c @@ -1184,6 +1184,8 @@ static int net_connect_locked(int sockfd, const struct net_sockaddr *addr, int a * 函数说明:1. 按 NET_SEND_CHUNK_MAX(硬件发送缓冲上限,见 Trap 20)分块写入 CH395F 发送 FIFO * 2. 发送前等待 send_ready 置位,超时返回已发送字节数 * 3. 每写完一块等待 SEND_OK 中断(send_ready 清零后重新置位) + * 4. 发送中途断连(状态非 ESTABLISHED)→ 立即失败并返回已发字节 + * (errno=CONNRESET,不再空等超时) */ static int net_send_locked(net_sock_t *p_sock, const void *buf, int len) { int sent = 0; @@ -1209,6 +1211,12 @@ static int net_send_locked(net_sock_t *p_sock, const void *buf, int len) { } if (!p_sock->send_ready) { + /* 发送中途断连(DISCONNECT/TIMEOUT 已由 net_poll 处理并置状态非 ESTABLISHED): + * 立即失败,不再空等满超时(旧行为:白等 1s 后报 TIMEDOUT) */ + if (p_sock->state != NET_SOCK_STATE_ESTABLISHED) { + s_net_errno = NET_ERR_CONNRESET; + break; + } if (NET_SEND_TIMEOUT_MS > 0 && (HAL_GetTick() - tick_start) >= NET_SEND_TIMEOUT_MS) { DBG_ERROR("sock%d send stall: send_ready not set (%d/%d)", sockfd, sent, len); @@ -1232,6 +1240,11 @@ static int net_send_locked(net_sock_t *p_sock, const void *buf, int len) { tick_start = HAL_GetTick(); while (!p_sock->send_ready) { + /* 发送中途断连:立即失败(同外层,避免白等超时) */ + if (p_sock->state != NET_SOCK_STATE_ESTABLISHED) { + s_net_errno = NET_ERR_CONNRESET; + break; + } net_poll(); if (NET_SEND_TIMEOUT_MS > 0 && (HAL_GetTick() - tick_start) >= NET_SEND_TIMEOUT_MS) {