2014-02-05 46 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

相關問題