c - 事件循环 - 在套接字连接上触发
问题描述
我正在尝试更多地了解事件循环并完全理解它,所以我试图做一些基本的事情。我在 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;
}
有人可以解释为什么会发生这种情况并告诉我如何解决吗?
解决方案
推荐阅读
- python - sklearn:在 jupyter notebook 中导入 sklean 时出错
- angular - observable 的订阅者如何在 6 秒的时间间隔内接收发出的项目(在其订阅时间内的所有项目)?
- apache-spark - 如何处理独立火花集群中的共享文件权限?
- bash - 测试:bash 脚本中的参数过多
- reactjs - 如何在反应中构建基于查询的 URL
- facebook-login - 无法从 facebook 响应加载图像
- ruby-on-rails - Rspec 请求规范 ActionController::RoutingError
- ios - 科尔多瓦 IOS 应用程序所有 onclick 和后退按钮不适用于最新的 IOS 11.3.1
- php - 对象中的 mysqli_fetch_assoc
- html - 科尔多瓦文件下载并使用科尔多瓦打开它