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
)。私のコードにエラーがありますか、それとも asyncore/select() で AF_UNIX ソケットを管理できませんか?