从读取asyncore documentation来看,似乎应该在成功连接到侦听套接字之后调用handle_connect()。但在实践中,asyncore似乎不会运行handle_connect(),除非它在套接字上接收或发送数据包。
举个例子:
我绑定了服务器套接字,并在某个端口上侦听。套接字将接受任何传入的连接,打印接收到的内容,并返回“谢谢”。
然后,我启动了一个基于asyncore.dispatcher的客户机,它在创建时连接到服务器套接字。客户端有一个方法handle_connect(),它向服务器发送一个"hello“数据包。它还有一个方法read,用于打印接收到的数据包。(在这种情况下,它应该打印“谢谢”)
当此客户端运行时,连接被创建,TCP握手成功,服务器能够接受该连接,但不会发生任何其他事情。永远不会调用handle_connect()。
让asyncore运行handle_connect()的唯一方法是,如果服务器通过发送数据包启动,或者如果我在__init()__函数中向服务器发送数据包。然后handle_connect()就可以工作了,一切都可以正常工作。
这就是事情应该如何运作的吗?如果是这样,为什么呢?或者这只是一个自编写asyncore以来就没有纠正过的bug?
有没有其他方法可以解决这个问题?
发布于 2015-07-26 15:33:57
不是sock.connect的变通方法,但可用于捕获socket.error异常:
def handle_error(self):
t, v, tb = sys.exc_info()
if t == socket.error:
print("Connect error")发布于 2015-10-02 18:21:56
可能不会调用handle_connect,因为在派生类的初始化方法中,您可能已经使用1调用了setblocking()函数。连接将在初始化调用中建立,而handle_connect将永远不会被调用。
如果不是这样,那么readable方法将返回false,并且不会调用handle_connect。
发布于 2016-04-04 22:09:13
我刚刚在Python3上遇到了同样的问题。在一些/所有(现在已经记不住确切的细节)系统上,当建立连接时,会发出"socket write ready“事件的信号。因此,如果在连接套接字之前,调度程序的writeable()方法返回False,则异步核心模块中的select()/poll()函数将永远不会检查套接字是否变为“可写”,也永远不会检测到连接建立,也永远不会调用handle_connect()方法。
我用以下方式修复了它:
def writable(self):
if not self.connected:
return True
# ... your logic goes herehttps://stackoverflow.com/questions/30926027
复制相似问题