- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 MacOS 中,我使用 O_NONBLOCK
设置了一个读+写套接字来连接到远程服务器。我使用 kqueue 来等待和协调 I/O 事件。对 connect()
的调用立即触发 EINPROGRESS
,这是理所应当的。很快,连接就完成了。这是通过从服务器接收数据来确认的。
但是,我认为当连接最终完成并变得可写时,kqueue 会返回一个 kevent 吗?没有这样的事件到来。 connect()
的手册页指出:
[EINPROGRESS] The socket is non-blocking and the connection cannot be completed immediately. It is possible to select(2) for completion by selecting the socket for writing.
(1) 这是否意味着我需要使用 select()
而不是 kqueque 来接收连接完成的通知?
(2) 顺便说一句,如果我尝试连接到端口上没有任何内容监听的服务器,那么 kevent 很快就会返回 EOF 来报告那里没有任何内容。
(3) 如果我尝试连接到不存在的 IP,那么我的 kevent 在我设置的超时时间(15 秒)后就会超时。
代码如下。编译,启动一个“服务器”,例如nc -l 10000
,运行带或不带IP地址参数的程序,它将分别远程或本地连接。
#include <sys/event.h>
#include <stdio.h>
#include <string.h>
#include <arpa/inet.h>
#include <errno.h>
#include <fcntl.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int fd = socket(PF_INET, SOCK_STREAM, 0);
if (fd < 0) {
perror("socket");
}
int fcntl_flags = fcntl(fd, F_GETFL);
if (fcntl_flags < 0) {
perror("fcntl");
}
fcntl_flags = fcntl(fd, F_SETFL, fcntl_flags | O_NONBLOCK);
if (fcntl_flags < 0) {
perror("fcntl");
}
struct sockaddr_in addr_in;
memset(&addr_in, 0, sizeof addr_in);
addr_in.sin_family = AF_INET;
addr_in.sin_port = htons(10000);
if (!inet_pton(AF_INET, argc > 1 ? argv[1] : "127.0.0.1", &addr_in.sin_addr)) {
perror("inet_aton");
exit(EXIT_FAILURE);
}
struct kevent change;
struct kevent event;
// Create kqueue
int kq;
if ((kq = kqueue()) < 0) {
perror("kqueue");
}
// Set read and write on socket
EV_SET(&change, fd, EVFILT_READ | EVFILT_WRITE, EV_ADD | EV_CLEAR, 0, 0, NULL);
// Put socket in kqueue, return immediately
struct timespec tmout = { 0, 0 };
int nev = kevent(kq, &change, 1, &event, 1, &tmout);
printf("Number events: %d (should be 0)\n", nev);
// Connect socket to server
if (!connect(fd, (struct sockaddr *) &addr_in, sizeof(struct sockaddr))) {
printf("Connected\n");
}
else if (errno == EINPROGRESS) {
printf("EINPROGRESS\n");
}
// Wait for connection to complete
tmout.tv_sec = 15;
nev = kevent(kq, &change, 0, &event, 1, &tmout);
if (nev) {
printf("Number events: %d, filter: %x, flags: %x, data: %ld\n", nev, event.filter, event.flags, event.data);
}
else {
printf("Timeout\n");
}
return 0;
}
最佳答案
想通了。
EVFILT_READ == ffffffff
EVFILT_WRITE == fffffffe
这使得 EVFILT_READ | EVFILT_WRITE == EVFILT_READ
结果是“或”将它们组合在一起使 kqueue 仅等待 READ 事件。标志可以是“或”,但过滤器不应该。
关于c - 非阻塞连接不会向 kqueue 报告完成情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55319444/
使用 kqueue 注册事件时与该事件相关的 ID 提供类型;例如,文件描述符用于标识文件以 watch int kq; struct kevent ke; kq = kqueue(); fd = o
我正在尝试编写一个小程序来发送和接收 UDP 流量并通过 HTTP 接口(interface)接收命令。 HTTP 服务器位于一个 multiprocessing.Process 中; UDP 服务器
我正在尝试使用 kqueue 观察目录大小的变化,这可能吗?这样做的原因是因为我正在监视目录,每当事件触发时,我都会统计目录并比较上次修改时间等,以确定是否发生了内容修改、添加、删除或重命名事件。我的
我使用 kquque 来监控桌面: 标志 - EV_ADD | EV_CLEAR fflags - 注意删除 |注_写 |注意_扩展 |注_属性 |注意_LINK |注意_RENAME | NOTE_
kqueue(在 OS X 上)对读/写常规文件有用吗?我知道 epoll 不对 Linux 上的常规文件有用,所以我想知道 kqueue 是否也是如此。 编辑:我不是说读/写文件,显然 read()
好的:我正在 iPhone OS 应用程序中实现文件共享,当然这意味着文件系统监控。耶! 基本上,当用户将文件操作到 iTunes 中我的应用程序部分时,操作系统会在我可以访问的目录中进行复制和/或删
我正在 mac os x 上使用 Kqueues,并尝试监视文件夹 所以我使用了 EVFILT_VNODE 过滤器,并且我想在删除文件时收到通知,我尝试了 NOTE_DELETE 但它仅检测文件何时通
在 MacOS 中,我使用 O_NONBLOCK 设置了一个读+写套接字来连接到远程服务器。我使用 kqueue 来等待和协调 I/O 事件。对 connect() 的调用立即触发 EINPROGRE
在 mac 上我使用 kqueue,它表明 udata 未更改。但是,kevent 调用的 event_data 返回的数组正在进行一些修改。什么可能导致这种情况?我将指针传递给转换为 void* 的
我在做什么 我正在实现一个基于 python/kqueue (FreeBSD) 的解决方案来跟踪对特定日志文件的更改,当满足 KQ_NOTE_WRITE fflag 时,对文件的更改将由我的 pyth
kqueue mechanism有一个事件标志,EV_RECEIPT ,根据链接的手册页: ... is useful for making bulk changes to a kqueue with
我编写了并发应用程序并发现了错误: buildFdSets: file descriptor out of range 我发现这是一个进程中文件描述符数量的操作系统限制,在我的 FreeBSD 中是
我很难理解如何将 kqueue 用于用户空间事件。 我寻找 2 个用例。 用例 1:手动重置事件 用例 2:自动重置事件 我想我了解如何使用 kqueue() 和 kevent(),但我不清楚传递给
我正在学习有关 kqueue 的教程(特别是 http://eradman.com/posts/kqueue-tcp.html 和 https://wiki.netbsd.org/tutorials/
我知道,如果远程主机优雅地关闭连接,epoll将报告EPOLLIN,并且调用read或recv不会阻塞,并且将返回0字节(即流结束)。 但是,如果连接未正常关闭,并且 write 或 send 操作失
我的开发机器是 MacBook(当然有 kqueue)。然而,在生产环境中,我们运行的是 Linux(当然使用 epoll)。显然,要了解我的代码的性能特征,我需要使用 epoll 运行它。也就是说,
如果一个线程(比如 X)正在等待 epoll_wait(),另一个线程(比如 Y)是否可以调用 epoll_ctl() 来注册对文件的兴趣描述符 9。之前在线程X中调用epoll_wait()能否返回
我正在努力在 epoll 和 kqueue 标志之间画一条平行线,特别是 EPOLLONESHOT EPOLLET EPOLLEXCLUSIVE 和 EV_CLEAR/EV_DISPATCH/EV_O
Python Epoll 有一个名为 epoll.unregister 的函数,它从 epoll 对象中删除已注册的文件描述符。有谁知道Kqueue中与此类似的功能是什么。对于 kqueue 我只能找
我试图了解 kqueue 中 EV_DISABLE 和 EV_ENABLE 的用例。 int KQueue = kqueue(); struct kevent ev = { .ident = fd
我是一名优秀的程序员,十分优秀!