修复net公开API错误码被覆盖致UI推流连上即断(改用通知值回传,单连接EOF不关监听)
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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; /* 重建失败:交回主循环重试 */
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user