我试图了解有关事件循环的更多信息并完全理解它,所以我尝试了一些基本的事情。我在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;
}
有人可以解释为什么会发生这种情况,然后请告诉我如何解决?