网络主要内容测试完成

This commit is contained in:
2026-08-26 13:54:52 +08:00
parent 0a707034cc
commit 88160a5134
18 changed files with 2174 additions and 928 deletions

View File

@@ -113,6 +113,8 @@
└────── CLOSED ──────────────────┘
```
> **单连接 Server 自动重监听(`auto_relisten`**`net_listen()` 会为 TCP 监听 Socket 置 `auto_relisten = 1`。连接断开(`net_recv` 收到 EOF / 空闲 `net_accept`net 层**自动**重新 `OPEN + TCP_LISTEN`,状态由 `ESTABLISHED`/`CLOSED` 自动回到 `LISTENING`**应用层无需调用 `net_close()` + `net_listen()`**。这与 Linux BSD Socket“监听 Socket 常驻”语义一致——`net_accept()` 在每条新连接到达时返回,服务端循环不必维护重监听逻辑。
---
## 3. 线程安全设计
@@ -327,23 +329,26 @@ void tcp_server_single(void)
net_inet_ntoa(client_addr.sin_addr.s_addr, ip_str),
net_ntohs(client_addr.sin_port));
/* 接收和发送数据 */
/* 接收和发送数据单连接模式client_sock 即 listen_sock 自身) */
while (1)
{
len = net_recv(client_sock, buf, sizeof(buf) - 1, 0);
if (len <= 0) {
printf("连接断开\r\n");
/* 对端关闭net 层已在 EOF 时自动重监听,
直接 break外层 net_accept 会接下一个连接 */
printf("连接断开net 层自动重监听\r\n");
break;
}
buf[len] = '\0';
printf("收到: %s\r\n", buf);
/* 回显数据 */
net_send(client_sock, buf, len, 0);
}
net_close(client_sock);
/* 单连接模式不要在此 net_close(client_sock):它即监听 Socket
一旦关闭需重新 net_socket+net_bind+net_listen重监听已由 net 层自动完成 */
}
}
}
@@ -824,6 +829,8 @@ int net_listen(int sockfd);
| `sockfd` | socket 描述符 |
| 返回值 | 0 成功,-1 失败 |
> **自动重监听**`net_listen()` 对 TCP 监听 Socket 置 `auto_relisten = 1`。连接结束后 net 层自动回到 `LISTENING`,应用层无需手动 `net_close()` + `net_listen()`。
#### net_accept - 接受连接
```c
@@ -835,7 +842,7 @@ int net_accept(int sockfd, struct net_sockaddr *addr, int *addrlen);
| `sockfd` | 监听 socket 描述符 |
| `addr` | 输出:客户端地址 |
| `addrlen` | 输入输出:地址长度 |
| 返回值 | 新 socket 描述符,失败返回 -1 |
| 返回值 | 新连接描述符(单连接模式下 == 监听 `sockfd`),无连接时返回 -1可循环重试 |
#### net_connect - 连接服务器
@@ -876,7 +883,7 @@ int net_recv(int sockfd, void *buf, int len, int flags);
| `buf` | 接收缓冲区 |
| `len` | 缓冲区大小 |
| `flags` | 0=阻塞,`NET_MSG_DONTWAIT`=非阻塞 |
| 返回值 | 实际接收字节数0=对端关闭-1=错误 |
| 返回值 | 实际接收字节数`0`=对端关闭net 层随即自动重监听);`-1`=错误(非阻塞且无数据时返回 `NET_ERR_WOULDBLOCK` |
#### net_sendto - 发送 UDP 数据