首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >仅当套接字接收到数据时,如何触发kevent?

仅当套接字接收到数据时,如何触发kevent?
EN

Stack Overflow用户
提问于 2014-02-05 21:58:21
回答 1查看 267关注 0票数 1

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

kqtest.py:

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
import socket

trigger = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
trigger.connect(('localhost', 8080))
trigger.send(b"THIS IS THE TRIGGER!!! LA-DEE-DAAAAA-DEE-DAAA!!!")

一旦触发kqtest的输出:

代码语言:javascript
运行
复制
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并重新添加它?

EN

回答 1

Stack Overflow用户

发布于 2014-02-06 19:14:18

经过一些实验后,我发现,一旦触发器套接字关闭,它将导致kq.control立即返回,并在返回事件的标志属性中设置KQ_EV_EOF。我只需要在每次返回事件时检查标志,以确保它没有设置KV_EQ_EOF

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21589435

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档