2014-02-05 2 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 : kqtest의

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!!!") 

출력 내가 그것을 트리거 번 :

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이 즉시 반환되고 반환 된 이벤트의 플래그 특성에 KQ_EV_EOF이 설정되어있는 것으로 나타났습니다. 이벤트가 반환 될 때마다 플래그를 확인하여 KV_EQ_EOF이 설정되지 않았는지 확인해야합니다.

관련 문제