У меня есть некоторые проблемы с использованием asyncore с сокетами AF_UNIX. Этот код
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
). Есть ли ошибка в моем коде или я не могу управлять сокетами AF_UNIX с помощью asyncore/select()?