2014-02-05 48 views
1

下面是两个小脚本,显示我现在如何使用kevents,并重现我的问题。只有套接字接收数据时,我如何触发kevent?

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

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输出一次我触发它:

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并重新添加吗?

回答

0

我经过一番尝试发现,一旦触发套接字被关闭,它就会立即返回kq.control,并在返回的事件的flags属性中设置KQ_EV_EOF。每次事件返回时,我只需要检查一下标志,以确保它没有设置KV_EQ_EOF

相关问题