c语言tcp客户端断开连接后服务端如何重新阻塞等待连接
时间: 2024-11-03 15:23:56 浏览: 35
在C语言中,当TCP客户端通过`close()`函数主动断开连接后,服务器通常会进入一个等待状态,直到它再次监听到新的连接请求。对于基于套接字的网络编程,如使用`accept()`函数,服务器一般会在循环中不断检查是否有新的连接可用。
以下是简化的示例代码片段:
```c
#include <stdio.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
int main() {
int server_fd, client_fd;
struct sockaddr_in server_addr, client_addr;
socklen_t addr_len = sizeof(client_addr);
// 创建并绑定服务器套接字
server_fd = socket(AF_INET, SOCK_STREAM, 0);
bind(server_fd, (struct sockaddr *)&server_addr, sizeof(server_addr));
listen(server_fd, SOMAXCONN); // 等待连接
while (1) { // 无限循环,持续监听新连接
client_fd = accept(server_fd, (struct sockaddr *)&client_addr, &addr_len);
if (client_fd == -1) {
perror("Accept failed");
continue; // 如果接受失败,继续尝试
}
// 连接建立后,处理客户端数据或命令,这里略去实际业务逻辑
// ...
// 客户端断开连接时,close(client_fd)
close(client_fd);
// 重新阻塞,等待下一个连接
FD_ZERO(&server_fd); // 清空套接字集合
FD_SET(server_fd, &server_fd); // 添加服务器套接字到集合
select(server_fd + 1, &server_fd, NULL, NULL, NULL); // 阻塞等待新连接
}
}
```
在上述代码中,每次`accept()`返回一个新的连接时,都会处理那个连接。如果客户端关闭了连接(`close(client_fd)`),程序会继续在`select()`函数中阻塞,直到有新的连接到来。这样就实现了服务器端在客户端断开连接后的重新阻塞和等待。
阅读全文