使用多处理和套接字时出现 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
已作为模块动态加载并且 .mai
n 是该模块中的函数之后,连接关闭。没有 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
中使用 !test
或 test.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
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
已作为模块动态加载并且 .mai
n 是该模块中的函数之后,连接关闭。没有 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
中使用 !test
或 test.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