使用多处理和套接字时出现 SSL 错误

SSL error with using multiprocessing and sockets

Python版本:3.4.3

Arch Linux: 4.1.3-1-ARCH

我在使用 SSL 模块包装的套接字时遇到此错误: ssl.SSLError: [SSL: SSLV3_ALERT_BAD_RECORD_MAC] sslv3 alert bad record mac (_ssl.c:1769)

您可能需要知道的事情。将方法传递给多进程时出现此错误。我有一个基本的 class irc,我的 bot 继承了 irc,bot 是将方法作为参数传递给进程的那个。我正在尝试制作一个可以使用插件类型系统的 irc 机器人。

我想我缩小到进入多进程后关闭套接字。但是,只有在使用 SSL 时才会发生这种情况。

Here is the pastebin 我认为您需要知道的错误。

IRC SSL 错误

这发生在我发送 command/plugin/addon 用作 multiprocessing check[3].main 已作为模块动态加载并且 .main 是该模块中的函数之后,连接关闭。没有 SSL 的普通套接字工作得很好并且符合预期,只有当它被包裹在 SSL 中时它似乎会关闭连接?

ssl.SSLError: [SSL: SSLV3_ALERT_BAD_RECORD_MAC] sslv3 alert bad record mac (_ssl.c:1769)

com_process = multiprocessing.Process(target=check[3].main, args=(check[0], check[1], check[2], self.sendIrc))

sendIrc is only being used as below in another class we have inherited from.
def sendIrc(self, data):
    if type(data) == str:
        self.sendData("PRIVMSG %s :%s\r\n" % (self.channel, data))
        return

sendData encode as utf-8 because python3:
def sendData(self, data):
    self.sock.send(data.encode('utf-8'))

check[3].main指向这个动态加载的模块,运行在multiprocessing下: 导入时间

def main(nick, comargvs, chan, send):
    print(nick, comargvs, chan)
    time.sleep(5)
    send("Success!")

在 tun 之后,父代码或调用主代码会收到我发布的错误,但只有在使用 SSL 时才会出现。

如果您需要有关其工作原理的更多信息,请点击此处 the GitHub Repository of the bot。我只在 addons 中使用 !testtest.py 来使用 SSL 重现错误,即配置文件中的 ssl = True,当禁用 SSL 时它工作得很好并且不出所料。

这个问题直到我开始将 ircSend 传递给 plugins/addons 时才发生,当它们死掉时,SSL 中的套接字也会死掉。我以前使用队列,但决定使用这种方式。

任何帮助或为什么抛出此错误或为什么它只发生在 SSL 上都是很好的。

现在已经解决了。我选择了 python 3 selector 和队列。问题是使用套接字流的句柄,这通常没问题,但使用 SSL 我最初发布时有错误。

我认为问题在于将 SSL 套接字的句柄传递给 'threaded'/多进程。当它退出时,整个套接字的句柄也会退出,但仅在使用 ssl 时。

线程锁和多进程锁没有帮助,RAND_add() 和变体也没有帮助修复它(python 文档推荐)。

我的工作方式是,处理 sock handle 的任何事情都在 main 中,读取阻塞套接字是一个问题,但随着超时转移到 select,所以现在 CPU没有被强奸,一切正常。

已解决的代码在 main() 下: https://github.com/nulldigit90/TechBot/blob/master/ircbot/TechBot.py