我在使用带有 AF_UNIX 套接字的 asyncore 时遇到了一些问题。这段代码
import asyncore, socket, os
class testselect(asyncore.dispatcher):
path = '/tmp/mysocket'
def __init__(self):
asyncore.dispatcher.__init__(self)
self.create_socket(socket.AF_UNIX, socket.SOCK_DGRAM)
self.bind(self.path)
self.buffer = 'buffer'
def handle_connect(self):
print 'handle_connect'
pass
def handle_close(self):
print 'handle_close'
if os.path.exists(self.path)
os.remove(self.path)
self.close()
def handle_read(self):
print 'handle_read'
print self.recv(8192)
def writable(self):
print 'writable'
return (len(self.buffer) > 0)
def handle_write(self):
print 'handle_write'
sent = self.send(self.buffer)
self.buffer = self.buffer[sent:]
client = testselect()
asyncore.loop()
如果我执行代码
$ python select_prova.py
writable
handle_connect
handle_write
handle_close
$
它立即退出,不等待读写。如果我更改代码以强制 writable() 方法始终返回False
,它会正确等待输入,我可以像这样与 socat 通信
$ socat readline UNIX:/tmp/mysocket
但仅用于阅读(逻辑上写不起作用,因为 writable() 返回False
)。我的代码中是否有错误,或者我无法使用 asyncore/select() 管理 AF_UNIX 套接字?