事件循环-套接字连接触发

时间:2018-08-29 18:38:21

标签: c

我试图了解有关事件循环的更多信息并完全理解它,所以我尝试了一些基本的事情。我在Mac上,因此我在使用 kqueue

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

NEW CLIENT
NEW CLIENT
NEW CLIENT
NEW CLIENT
NEW CLIENT

等...

推测只能在新的套接字连接上打印“ 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;
}

有人可以解释为什么会发生这种情况,然后请告诉我如何解决?

0 个答案:

没有答案