EVFILT_WRITE 返回两次

问题描述 投票:0回答:2

当文件描述符可用于写入时,我尝试将缓冲区发送到我的套接字客户端。

EV_SET 设置为:EVFILT_WRITE、EV_ADD | EV_DISABLE | EV_CLEAR

然后当更改为 EVFILT_WRITE、EV_ENABLE 时,EVFILT_WRITE 会被触发一次,这很棒!

但是如果我在得到EVFILT_WRITE时使用函数writesend,如下所示:

if (e->filter == EVFILT_WRITE)
send(socket, buff, strlen(buff), 0);

然后我再次收到另一个 EVFILT_WRITE 事件。发送函数似乎触发了另一个 EVFILT_WRITE 事件。这是预期的行为吗?我认为 EVFILT_WRITE 仅当文件描述符可用于写入时才会触发。

我搜索了这个问题,但似乎没有人提到这一点。有人可以确认这是否是预期的行为以及为什么吗?

c freebsd kqueue
2个回答
0
投票

我是这样理解的:

自从您使用

EV_CLEAR
以来,
kevent
设施开始返回状态转换,而不是当前状态。因此,每当您使用
socket
kevent()
调用触摸
send()
描述符时,您都会收到
EVFILT_WRITE
事件返回。

另一种看待这个问题的方式:

当调用

send()
时,描述符暂时无法写入,然后再次变得可用,这就是您收到事件的原因。

我会尝试让一些知识渊博的人来回答这个问题。


0
投票

这应该发生。

您只需要知道EVFILT_WRITE如何工作以及事件发生在哪里。

当客户端连接时,设置EVFILT_WRITE,并在通信完成后。

您将收到写入事件发生的通知

使用发送或写入功能让事件发生

要在发送或写入功能后测试这一点, 等待几秒钟(这使文件描述符检测写入)您将看到写入发生的通知。

© www.soinside.com 2019 - 2024. All rights reserved.