Примечание Как указано в другом ответе, при отправке дейтаграммы необходимо указать получателя.В своем нынешнем виде ваш класс testselect
больше похож на клиента, чем на сервер.
Просмотрите некоторые из этих asyncore examples
, чтобы найти шаблон сервера, который вы можете скопировать.Пример TimeChannel
ближе к тому, что вы хотите - измените socket.AF_INET
на socket.AF_UNIX
и используйте путь сокета для адреса привязки, чтобы он использовал сокет домена UNIX.
You 'заново установите socket.SOCK_DGRAM
, что обычно указывает на создание сокета UDP INET.Доменные сокеты Unix являются формой IPC.Вы должны изменить его на socket.SOCK_STREAM
, вызвать self.listen([backlog])
, внедрить handle_accept()
и т. Д.
Если вы намеревались использовать SOCK_DGRAM с AF_UNIX, то причина, по которой ваш сервер завершает работу, заключается в том, что он указывает writable
как только он запускается, что приводит к запуску handle_write
, немедленно отправляя пакет, содержащий 'buffer'
.
Если вы хотите, чтобы ваш сервер дождался получения пакета, прежде чем ответить, установите буфер в handle_connect
или handle_read
:
def __init__(self):
...
self.buffer = ''
def handle_connect(self):
self.buffer = 'buffer'
Теперь, когда вы запускаете ваш сервер, он будет ждать получения пакета от socat
.
Я переписал ваш примерработать больше, как ты, и т. д .:
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_STREAM)
self.set_reuse_addr()
self.bind(self.path)
self.listen(5)
def handle_accept(self):
client = self.accept()
if client is None:
pass
else:
handler = testhandler(*client)
class testhandler(asyncore.dispatcher_with_send):
def __init__(self, sock, addr):
asyncore.dispatcher_with_send.__init__(self, sock)
self.addr = addr
self.buffer = 'greetings'
def handle_read(self):
print self.recv(8192)
def writable(self):
return (len(self.buffer) > 0)
def handle_write(self):
self.send(self.buffer)
self.buffer = ''
def handle_close(self):
self.close()
server = testselect()
try:
asyncore.loop()
finally:
if os.path.exists(testselect.path):
os.unlink(testselect.path)