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를 제거하고 다시 추가해야합니까?