使用AF_UNIX套接字的python asyncore问题
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了使用AF_UNIX套接字的python asyncore问题,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2790字,纯文字阅读大概需要4分钟。
内容图文
我在使用带有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套接字?
解决方法:
注意正如另一个答案所指出的,当您发送数据报时,您需要指定接收器.就目前而言,您的testselect类看起来更像客户端而不是服务器.
查看其中一些asyncore examples以查找可以复制的服务器模式. TimeChannel示例更接近您想要的 – 将socket.AF_INET更改为socket.AF_UNIX并使用套接字路径作为绑定地址,以使其使用UNIX域套接字.
您正在设置socket.SOCK_DGRAM,它通常表示创建UDP INET套接字. Unix域套接字是IPC的一种形式.您应该将其更改为socket.SOCK_STREAM,调用self.listen([backlog]),实现handle_accept()等.
如果您确实打算将SOCK_DGRAM与AF_UNIX一起使用,那么服务器退出的原因是它一旦启动就表明它是可写的,这会导致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)
内容总结
以上是互联网集市为您收集整理的使用AF_UNIX套接字的python asyncore问题全部内容,希望文章能够帮你解决使用AF_UNIX套接字的python asyncore问题所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。