修复net公开API错误码被覆盖致UI推流连上即断(改用通知值回传,单连接EOF不关监听)

This commit is contained in:
2026-09-21 04:46:47 +08:00
parent 57632e910a
commit 5cb7614959
3 changed files with 54 additions and 15 deletions
+42 -8
View File
@@ -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;
}
+10 -6
View File
@@ -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; /* 重建失败:交回主循环重试 */
}
}
}