如何仅在套接字接收数据时触发kevent?

2024-10-05 10:08:16 发布

您现在位置:Python中文网/ 问答频道 /正文

这里有两个小脚本,展示了我现在如何使用kevents,并重现了我的问题。在

kqtest.py:

import socket
import select
import threading

server_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
server_sock.bind(('localhost', 8080))
server_sock.listen(1)

client, addr = server_sock.accept()

kev = select.kevent(client)
kq = select.kqueue()
kq.control([kev], 0, 0)

while True:
    events = kq.control([], 1, 1)
    if events:
        event = events[0]
        if event.ident == kev.ident:
            print("ready to read client %s:%s" % addr)
            print(client.recv(1024))

kqtesttrigger.py

^{pr2}$

触发kqtest后的输出:

ready to read client 127.0.0.1:63868
b'THIS IS THE TRIGGER!!! LA-DEE-DAAAAA-DEE-DAAA!!!'
ready to read client 127.0.0.1:63868
b''
ready to read client 127.0.0.1:63868
b''
ready to read client 127.0.0.1:63868
b''
...this repeats until I kill it

我想要的是kevent只在数据被添加到套接字时被触发。我需要从kqueue中删除kevent并重新添加吗?在


Tags: topyimportclientreadserversocketevents
1条回答
网友
1楼 · 发布于 2024-10-05 10:08:16

我在做了一些实验后发现,一旦触发器插座被关闭,就会导致kq控制立即返回并在返回事件的flags属性中设置KQ_EV_EOF。我只需要在每次返回事件时检查标志,以确保它没有设置KV_EQ_EOF!在

相关问题 更多 >

    热门问题