Asyncore没有运行handle_connect()

时间:2015-06-18 21:21:32

标签: python sockets python-2.7 tcp asyncore

从阅读asyncore documentation开始,在成功连接到侦听套接字后,即在TCP握手完成后,应该调用handle_connect()。但在实践中,似乎asyncore不会运行handle_connect(),除非它在套接字上接收或发送数据包。

举个例子:

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

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

运行此客户端时,将创建连接,TCP握手成功,服务器可以接受连接,但不会发生任何其他情况。永远不会调用handle_connect()

使asyncore运行handle_connect()的唯一方法是服务器首先发送数据包,或者如果我在__init()__函数中向服务器发送数据包。然后handle_connect()起作用,一切正常。

这是事情应该如何运作?如果是这样,为什么?或者这只是一个自asyncore以来没有纠正的错误?

还有其他方法可以解决这个问题吗?

3 个答案:

答案 0 :(得分:0)

不是sock.connect的解决方法,但可用于捕获socket.error例外:

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

答案 1 :(得分:0)

可能无法调用handle_connect,因为在派生类的 init 方法中,您可能已使用1调用setblocking()函数。将在 init 调用中建立连接并且永远不会调用handle_connect。

如果不是这种情况,则可读方法返回false并且handle_connect不会被调用。

答案 2 :(得分:0)

我刚刚遇到了与Python 3相同的问题。在部分/全部(现在不能记住确切的细节)系统,当建立连接时,发出“socket ready ready”事件的信号。因此,如果您的调度程序的writeable()方法在连接套接字之前返回False,则asyncore模块中的select() / poll()函数将永远不会检查套接字是否变为“可写” ,永远不会检测到连接建立,永远不会调用handle_connect()方法。

我按照以下方式修复了它:

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