当文件描述符可用于写入时,我尝试将缓冲区发送到我的套接字客户端。
EV_SET 设置为:EVFILT_WRITE、EV_ADD | EV_DISABLE | EV_CLEAR
然后当更改为 EVFILT_WRITE、EV_ENABLE 时,EVFILT_WRITE 会被触发一次,这很棒!
但是如果我在得到EVFILT_WRITE时使用函数write或send,如下所示:
if (e->filter == EVFILT_WRITE)
send(socket, buff, strlen(buff), 0);
然后我再次收到另一个 EVFILT_WRITE 事件。发送函数似乎触发了另一个 EVFILT_WRITE 事件。这是预期的行为吗?我认为 EVFILT_WRITE 仅当文件描述符可用于写入时才会触发。
我搜索了这个问题,但似乎没有人提到这一点。有人可以确认这是否是预期的行为以及为什么吗?
我是这样理解的:
自从您使用
EV_CLEAR
以来,kevent
设施开始返回状态转换,而不是当前状态。因此,每当您使用 socket
或 kevent()
调用触摸 send()
描述符时,您都会收到 EVFILT_WRITE
事件返回。
另一种看待这个问题的方式:
当调用
send()
时,描述符暂时无法写入,然后再次变得可用,这就是您收到事件的原因。
我会尝试让一些知识渊博的人来回答这个问题。
这应该发生。
您只需要知道EVFILT_WRITE如何工作以及事件发生在哪里。
当客户端连接时,设置EVFILT_WRITE,并在通信完成后。
要在发送或写入功能后测试这一点, 等待几秒钟(这使文件描述符检测写入)您将看到写入发生的通知。