网络主要内容测试完成
This commit is contained in:
@@ -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 数据
|
||||
|
||||
|
||||
Reference in New Issue
Block a user