首页 > 解决方案 > 事件循环 - 在套接字连接上触发

问题描述

我正在尝试更多地了解事件循环并完全理解它,所以我试图做一些基本的事情。我在 Mac 上,所以我正在使用kqueue

这个想法是仅在新的套接字连接上触发事件循环。事件循环在套接字连接上触发,但不会在下一个循环中停止。它在第一次连接后继续打印:

NEW CLIENT
NEW CLIENT
NEW CLIENT
NEW CLIENT
NEW CLIENT

ETC...

它应该只在新的套接字连接上打印“NEW CLIENT”。

这是完整的源代码:

#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <sys/types.h>
#include <sys/event.h>
#include <sys/time.h>
#include <errno.h>


struct kevent e;
static struct sockaddr_in server;
static int server_fd, queue;


static void event_server_listen (int port) {
    int err, flags;

    queue = kqueue();

    server_fd = socket(AF_INET, SOCK_STREAM, 0);


    server.sin_family = AF_INET;
    server.sin_port = htons(port);
    server.sin_addr.s_addr = htonl(INADDR_ANY);

    int opt_val = 1;
    setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &opt_val, sizeof(opt_val));

    err = bind(server_fd, (struct sockaddr *) &server, sizeof(server));

    flags = fcntl(server_fd, F_GETFL, 0);


    err = fcntl(server_fd, F_SETFL, flags | O_NONBLOCK);


    err = listen(server_fd, SOMAXCONN);

}


static void event_change (int ident, int filter, int flags, void *udata) {

    e.ident = ident;
    e.filter = filter;
    e.flags = flags;
    e.fflags = 0;
    e.data = 0;
    e.udata = udata;
}

static void event_loop () {

    while (1) {


        int nev = kevent(queue, &e, 1, &e, 1, NULL);

        if (nev == -1) { exit(0); }


        printf("NEW CLIENT\n");


    }
}





int main (int argc, char *argv[]) {


    int port = 8899;

    event_server_listen(port);
    event_change(server_fd, EVFILT_READ, EV_ADD | EV_ENABLE, NULL);
    event_loop();

    return 0;
}

有人可以解释为什么会发生这种情况并告诉我如何解决吗?

标签: c

解决方案


推荐阅读