gqday2

selete服务器并发

#include <myhead.h>

#define MAX_CLIENTS 10
#define BUFFER_SIZE 1024

int main() {
    int server_fd, client_fds[MAX_CLIENTS], max_fd;
    struct sockaddr_in server_addr, client_addr;
    char buffer[BUFFER_SIZE];

    // 创建服务器套接字
    server_fd = socket(AF_INET, SOCK_STREAM, 0);
    if (server_fd == -1) {
        perror("Socket creation failed");
        exit(EXIT_FAILURE);
    }

    // 初始化服务器地址结构
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = INADDR_ANY;
    server_addr.sin_port = htons(8080);

    // 绑定服务器套接字到指定地址和端口
    if (bind(server_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {
        perror("Bind failed");
        exit(EXIT_FAILURE);
    }

    // 监听
    if (listen(server_fd, MAX_CLIENTS) == -1) {
        perror("Listen failed");
        exit(EXIT_FAILURE);
    }

    printf("Server listening on port 8080\n");

    fd_set read_fds, all_fds;
    int i, fd;

    FD_ZERO(&all_fds);
    FD_SET(server_fd, &all_fds);
    max_fd = server_fd;

    // 初始化客户端套接字数组
    for (i = 0; i < MAX_CLIENTS; i++) {
        client_fds[i] = -1;
    }

    while (1) {
        read_fds = all_fds;

        // 使用 select 监听读事件
        if (select(max_fd + 1, &read_fds, NULL, NULL, NULL) == -1) {
            perror("Select failed");
            exit(EXIT_FAILURE);
        }

        // 检查服务器套接字是否有新连接
        if (FD_ISSET(server_fd, &read_fds)) {
            socklen_t addr_len = sizeof(client_addr);
            // 接受新连接
            int new_fd = accept(server_fd, (struct sockaddr *)&client_addr, &addr_len);
            if (new_fd == -1) {
                perror("Accept failed");
                exit(EXIT_FAILURE);
            }

            // 将新连接添加到客户端套接字数组
            for (i = 0; i < MAX_CLIENTS; i++) {
                if (client_fds[i] == -1) {
                    client_fds[i] = new_fd;
                    break;
                }
            }

            // 更新最大文件描述符
            if (new_fd > max_fd) {
                max_fd = new_fd;
            }

            printf("New client connected. Socket fd: %d, IP address: %s, Port: %d\n",
                   new_fd, inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
        }

        // 检查客户端套接字是否有数据可读
        for (i = 0; i < MAX_CLIENTS; i++) {
            fd = client_fds[i];
            if (fd != -1 && FD_ISSET(fd, &read_fds)) {
                // 读取客户端数据
                int bytes_read = read(fd, buffer, BUFFER_SIZE);
                                if (bytes_read <= 0) {
                    // 连接关闭或发生错误,移除客户端套接字
                    printf("Client disconnected. Socket fd: %d\n", fd);
                    close(fd);
                    FD_CLR(fd, &all_fds);
                    client_fds[i] = -1;
                } else {
                    // 处理客户端数据
                    printf("Received data from client. Socket fd: %d\n", fd);
                    // 在此处添加处理客户端数据的代码
                }
            }
        }
    }

    close(server_fd);

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值