int accept(int sockfd, struct sockaddr addr, socklen_t addrlen);
while (1) {
client_fd = accept(server_fd, (struct sockaddr*)&client_addr, &addr_len);
if (client_fd < 0) {
perror("accept failed");
continue;
}
// 处理客户端请求
handle_client(client_fd);
close(client_fd);
}
int client_fd = accept(server_fd, &client_addr, &addr_len); if (client_fd >= 0) {
// 立即设置非阻塞模式是个好习惯
fcntl(client_fd, F_SETFL, O_NONBLOCK);
// 记录连接信息便于后续管理
printf("新连接: fd=%d, 来自 %s:%d\n",
client_fd,
inet_ntoa(client_addr.sin_addr),
ntohs(client_addr.sin_port));
// 将描述符加入管理结构
add_to_connection_pool(client_fd);
}
fd_set read_fds; FD_ZERO(&read_fds); FD_SET(server_fd, &read_fds);
while (1) {
fd_set tmp_fds = read_fds;
int ready = select(max_fd + 1, &tmp_fds, NULL, NULL, NULL);
if (FD_ISSET(server_fd, &tmp_fds)) {
// 有新的连接等待接受
int client_fd = accept(server_fd, NULL, NULL);
if (client_fd >= 0) {
FD_SET(client_fd, &read_fds);
max_fd = (client_fd > max_fd) ? client_fd : max_fd;
}
}
// 检查其他客户端描述符的可读状态
for (int fd = 0; fd <= max_fd; fd++) {
if (fd != server_fd && FD_ISSET(fd, &tmp_fds)) {
handle_client_data(fd);
}
}
}