diff --git a/App/task/ui_task.c b/App/task/ui_task.c index da62144d..ff3e68cb 100644 --- a/App/task/ui_task.c +++ b/App/task/ui_task.c @@ -84,8 +84,9 @@ void ui_task_func(void *argument) { } if (ui_net_sink_start(UI_NET_SINK_PORT) != 0) { DBG_ERROR("UI net sink: start FAIL"); + } else { + DBG_INFO("UI net sink: started (port %u)", (unsigned)UI_NET_SINK_PORT); } - DBG_INFO("UI net sink: started (port %u)", (unsigned)UI_NET_SINK_PORT); while (1) { ui_port_step(10); diff --git a/Drivers/BSP/NET/net_socket.c b/Drivers/BSP/NET/net_socket.c index b26ecc18..988a9d09 100644 --- a/Drivers/BSP/NET/net_socket.c +++ b/Drivers/BSP/NET/net_socket.c @@ -358,7 +358,11 @@ void net_process_messages(void) { switch (msg.type) { case NET_MSG_SEND: { net_sock_t *p_sock = net_get_sock(msg.sockfd); - if (p_sock == NULL || p_sock->state != NET_SOCK_STATE_ESTABLISHED) { + if (p_sock == NULL) { + s_net_errno = NET_ERR_BADF; + msg.result = -1; + } else if (p_sock->state != NET_SOCK_STATE_ESTABLISHED) { + s_net_errno = NET_ERR_NOTCONN; msg.result = -1; } else { msg.result = net_send_locked(p_sock, msg.buf, msg.len); @@ -368,6 +372,7 @@ void net_process_messages(void) { case NET_MSG_RECV: { net_sock_t *p_sock = net_get_sock(msg.sockfd); if (p_sock == NULL) { + s_net_errno = NET_ERR_BADF; msg.result = -1; } else { msg.result = net_recv_locked(p_sock, msg.buf, msg.len, msg.flags); @@ -377,6 +382,7 @@ void net_process_messages(void) { case NET_MSG_CLOSE: { net_sock_t *p_sock = net_get_sock(msg.sockfd); if (p_sock == NULL) { + s_net_errno = NET_ERR_BADF; msg.result = -1; } else { msg.result = net_close_locked(p_sock); @@ -401,11 +407,21 @@ void net_process_messages(void) { break; } default: + s_net_errno = NET_ERR; /* 未知消息类型:置通用错误码,保证回传值有效 */ msg.result = -1; break; } - xTaskNotify(msg.caller, (uint32_t)msg.result, eSetValueWithOverwrite); + /* 结果回传:成功时回传实际字节数/描述符;失败时回传具体错误码(如 NET_ERR_WOULDBLOCK)。 + * 注意消息体是按值拷入队列的——调用方看不到 netTask 对 msg 的修改,错误码只能搭 + * 通知值这趟车带回调用方,否则调用方只拿得到笼统的 NET_ERR,无法区分 WOULDBLOCK。 */ + { + uint32_t notify_val = (uint32_t)msg.result; + if (msg.result < 0) { + notify_val = (uint32_t)((s_net_errno != 0) ? s_net_errno : NET_ERR); + } + xTaskNotify(msg.caller, notify_val, eSetValueWithOverwrite); + } } } @@ -639,7 +655,10 @@ int net_listen(int sockfd) { } if (msg.result < 0) { - s_net_errno = NET_ERR; + /* netTask 把具体错误码(如 NET_ERR_WOULDBLOCK)以负值搭通知值回传,此处恢复为 + * errno;对外仍保持 BSD 语义——失败一律返回 -1 */ + s_net_errno = msg.result; + return -1; } return msg.result; } @@ -734,7 +753,10 @@ int net_accept(int sockfd, struct net_sockaddr *addr, int *addrlen) { } if (msg.result < 0) { - s_net_errno = NET_ERR; + /* netTask 把具体错误码(如 NET_ERR_WOULDBLOCK)以负值搭通知值回传,此处恢复为 + * errno;对外仍保持 BSD 语义——失败一律返回 -1 */ + s_net_errno = msg.result; + return -1; } return msg.result; } @@ -791,7 +813,10 @@ int net_connect(int sockfd, const struct net_sockaddr *addr, int addrlen) { } if (msg.result < 0) { - s_net_errno = NET_ERR; + /* netTask 把具体错误码(如 NET_ERR_WOULDBLOCK)以负值搭通知值回传,此处恢复为 + * errno;对外仍保持 BSD 语义——失败一律返回 -1 */ + s_net_errno = msg.result; + return -1; } return msg.result; } @@ -1197,7 +1222,10 @@ int net_send(int sockfd, const void *buf, int len, int flags) { /* ---- 6. 结果回传:负数视为错误并设置线程级错误码;否则返回实际发送字节数 ---- */ if (msg.result < 0) { - s_net_errno = NET_ERR; + /* netTask 把具体错误码(如 NET_ERR_WOULDBLOCK)以负值搭通知值回传,此处恢复为 + * errno;对外仍保持 BSD 语义——失败一律返回 -1 */ + s_net_errno = msg.result; + return -1; } return msg.result; } @@ -1247,7 +1275,10 @@ int net_recv(int sockfd, void *buf, int len, int flags) { } if (msg.result < 0) { - s_net_errno = NET_ERR; + /* netTask 把具体错误码(如 NET_ERR_WOULDBLOCK)以负值搭通知值回传,此处恢复为 + * errno;对外仍保持 BSD 语义——失败一律返回 -1 */ + s_net_errno = msg.result; + return -1; } return msg.result; } @@ -1291,7 +1322,10 @@ int net_close(int sockfd) { } if (msg.result < 0) { - s_net_errno = NET_ERR; + /* netTask 把具体错误码(如 NET_ERR_WOULDBLOCK)以负值搭通知值回传,此处恢复为 + * errno;对外仍保持 BSD 语义——失败一律返回 -1 */ + s_net_errno = msg.result; + return -1; } return msg.result; } diff --git a/Drivers/BSP/UI/ui_net_sink.c b/Drivers/BSP/UI/ui_net_sink.c index 621d603a..12d06be2 100644 --- a/Drivers/BSP/UI/ui_net_sink.c +++ b/Drivers/BSP/UI/ui_net_sink.c @@ -444,12 +444,16 @@ void ui_net_sink_poll(void) { rm_parser_feed((uint8_t)g_rx[i]); } } else if (n == 0) { - /* 对端关闭:关闭客户端,必要时重建监听(单连接模型下监听随客户端失效) */ - net_close(g_client); + /* 对端关闭:单连接模型下监听通道与数据通道是同一个 Socket,net 层已在 + * net_recv_locked 的 CLOSED 分支自动把该 Socket 放回 LISTEN;此处绝不能再 + * net_close 它,否则监听一并被毁(后续连接被拒),且重建监听受 Trap 09 时序限制 */ + if (g_client != g_listen) { + net_close(g_client); /* 多连接后端(PC 模拟器):数据通道独立,需显式关闭 */ + } g_client = -1; rm_parser_reset(); - if (net_get_sock(g_listen) == NULL) { - (void)bind_listen(); + if (net_get_sock(g_listen) == NULL && bind_listen() < 0) { + g_listen = -1; /* 重建失败:交回主循环重试,避免拿失效 fd 反复 accept */ } } else { /* n < 0:区分"暂无数据"(继续等待)与"真错误"(断开并视情况重建监听) */ @@ -457,8 +461,8 @@ void ui_net_sink_poll(void) { net_close(g_client); g_client = -1; rm_parser_reset(); - if (net_get_sock(g_listen) == NULL) { - (void)bind_listen(); + if (net_get_sock(g_listen) == NULL && bind_listen() < 0) { + g_listen = -1; /* 重建失败:交回主循环重试 */ } } }