首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Asyncore未运行handle_connect()

Asyncore未运行handle_connect()
EN

Stack Overflow用户
提问于 2015-06-19 05:21:32
回答 3查看 754关注 0票数 0

从读取asyncore documentation来看,似乎应该在成功连接到侦听套接字之后调用handle_connect()。但在实践中,asyncore似乎不会运行handle_connect(),除非它在套接字上接收或发送数据包。

举个例子:

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

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

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

让asyncore运行handle_connect()的唯一方法是,如果服务器通过发送数据包启动,或者如果我在__init()__函数中向服务器发送数据包。然后handle_connect()就可以工作了,一切都可以正常工作。

这就是事情应该如何运作的吗?如果是这样,为什么呢?或者这只是一个自编写asyncore以来就没有纠正过的bug?

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

EN

回答 3

Stack Overflow用户

发布于 2015-07-26 15:33:57

不是sock.connect的变通方法,但可用于捕获socket.error异常:

代码语言:javascript
复制
def handle_error(self):
    t, v, tb = sys.exc_info()
    if t == socket.error:
        print("Connect error")
票数 0
EN

Stack Overflow用户

发布于 2015-10-02 18:21:56

可能不会调用handle_connect,因为在派生类的初始化方法中,您可能已经使用1调用了setblocking()函数。连接将在初始化调用中建立,而handle_connect将永远不会被调用。

如果不是这样,那么readable方法将返回false,并且不会调用handle_connect。

票数 0
EN

Stack Overflow用户

发布于 2016-04-04 22:09:13

我刚刚在Python3上遇到了同样的问题。在一些/所有(现在已经记不住确切的细节)系统上,当建立连接时,会发出"socket write ready“事件的信号。因此,如果在连接套接字之前,调度程序的writeable()方法返回False,则异步核心模块中的select()/poll()函数将永远不会检查套接字是否变为“可写”,也永远不会检测到连接建立,也永远不会调用handle_connect()方法。

我用以下方式修复了它:

代码语言:javascript
复制
def writable(self):
    if not self.connected:
        return True
    # ... your logic goes here
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30926027

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档