Python SOCKET无限循环:堆栈溢出

时间:2014-03-06 17:31:15

标签: python sockets

我正在Blender Game Engine中创建一款游戏。我编写了一个IRC脚本,可以在OS X和Linux发行版上正常工作。输出类似于:

Logging in...
LOGIN_ERROR
LOGIN_ERROR
LOGIN_ERROR
LOGIN_ERROR
LOGIN_ERROR
LOGIN_ERROR
<name> has joined.
Logged in!

然后我可以调用sendmsg()函数将消息发送到IRC频道。

这是我尝试在Windows 7上运行时遇到的错误: stack overflow python sockets error

我的python IRC代码: http://pastebin.com/aG6TwTir

忽略“bge”引用。这些变量等都是从游戏引擎中填充的。

在游戏引擎中,我调用login()一次,然后吐出“LOGIN_ERROR”,所以我知道它正在尝试连接,然后它会连接,因此不会抛出异常并结束函数。

在OS X和Linux中,它可以完美无缺地在后台运行,而玩家可以在连接时继续播放。

在Windows 7中,它会抛出该错误。

所以我想需要发生的是一种等待脚本连接到服务器的方法。然后连接后,我可以发送登录信息并加入频道。

那我该如何等待连接?

仅供参考:我的套接字是非阻塞的,因为脚本需要在每个帧上与游戏引擎运行在同一个线程上。 Main()每帧都运行,而不是整个脚本。在菜单中,它执行脚本并调用login()。然后在游戏中,它将每帧调用Main()。 哦,我正在使用Python 3.3。

任何帮助都非常有用! ^ _ ^

编辑: 我该如何处理这个例外? irc exception

2 个答案:

答案 0 :(得分:1)

此代码:

def login():
    ...
    try:
        ...
    except:
        ...
        login()  #  <===

递归地调用自己;给定足够多的登录失败,取决于堆栈大小限制(这取决于我猜的平台),您将获得堆栈溢出。

另请参阅:Setting stacksize in a python script

虽然我总是会避免递归并改为使用循环,除非我事先知道递归深度永远不会超过~100:

while True:
    try:
        do_login()
    except:  # NOTE: USE A SPECIFIC EXCEPTION CLASS HERE, BTW
        continue
    else:
        break

答案 1 :(得分:0)

您的错误处理中发生了递归

def login():
    #print('login')
    # Bind the socket
    try:
        s.connect((HOST, PORT))
        # Send login info
        s.send(bytes('NICK %s\r\n' % NICK, 'UTF-8'))
        s.send(bytes('USER %s %s bla :%s\r\n' % (IDENT, HOST, REALNAME), 'UTF-8'))
        s.send(bytes('JOIN %s\r\n' % CHAN, 'UTF-8'));
        print('Logging in...')
        chatlog('Logging in...')
    except:
        print('LOGIN_ERROR')
        login()

所以在你的函数login()中你有一个尝试,然后在你再次调用login()之外。如果登录失败,这将一遍又一遍地循环。