2015-06-18 51 views
0

从读取asyncoredocumentation,似乎handle_connect()应成功连接到侦听套接字后调用,即TCP握手完成后应调用。但在实践中,看起来asyncore不运行handle_connect(),除非它在套接字上接收或发送数据包。Asyncore未运行handle_connect()

举个例子:

我有服务器套接字绑定和监听某个端口上。套接字将接受任何传入的连接,打印接收到的内容,并发回“谢谢”。

然后我开始一个asyncore.dispatcher基于客户端,创建时谁连接到服务器套接字。客户端有一个方法handle_connect()向服务器发送“hello”数据包。它还具有打印接收到的数据包的方法读取。 (在这种情况下,它应该打印“谢谢”)

当这个客户端运行时,连接被创建,TCP握手成功,服务器能够接受连接,但没有其他事情发生。永远不会调用handle_connect()

使异步运行handle_connect()的唯一方法是如果服务器通过发送数据包开始,或者如果我发送数据包到服务器的__init()__函数。然后handle_connect()工程,一切工作正常。

这是事情应该如何工作?如果是这样,为什么?或者这只是一个错误,因为asyncore被写入而没有更正?

有没有其他办法可以解决这个问题?

回答

0

不为sock.connect的方法,但可以用来捕捉socket.error例外:

def handle_error(self): 
    t, v, tb = sys.exc_info() 
    if t == socket.error: 
     print("Connect error") 
0

handle_connect可能不会因为在你的init方法要求你可能已经称为setblocking()函数的派生类1.连接将在初始设置内建立,handle_connect永远不会被调用。

如果不是这种情况,那么读取方法返回false和handle_connect犯规被调用。

0

我刚刚遇到了同样的问题与Python 3.在部分/全部(不记得确切的细节现在)系统,建立连接时,“套接字写就绪”事件通知。因此,如果您的调度程序的writeable()方法在套接字连接之前返回False,asyncore模块中的功能将永远不会检查套接字是否变为“可写入”,永远不会检测到连接建立,并且方法永远不会调用。

我固定它通过以下方式:

def writable(self): 
    if not self.connected: 
     return True 
    # ... your logic goes here