我正在尝试编写一个MD5解密器,它使用LAN进行解密,并使用每台PC上的所有可用CPU。 客户端代码:
import socket
import multiprocessing as mp
import select
import re
import hashlib
import sys
def decryptCall(list,text):
rangeNums = int(list[1]) - int(list[0]) + 1
for i in range(len(list)):
print my_socket
print "ok"
decrypt(list[i], int(list[i]) + rangeNums, text)
#p = mp.Process(target=decrypt,args=(list[i], int(list[i]) + rangeNums, text))
#p.start()
#processes.append(p)
def end():
for p in processes:
p.join()
print my_socket
print "goodbye"
sys.exit()
def decrypt(low,high,text):
counter = int(low)
high = int(high)
while counter <= high:
m = hashlib.new('md5')
m.update(str(counter))
if str(m.hexdigest()).lower() == str(text.lower()):
print "final: " + str(counter)
my_socket.send(str(counter))
end()
counter+=1
if __name__ == "__main__":
processes = []
dataList = []
q = mp.Queue()
ADDR = ('127.0.0.1', 1337)
my_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
my_socket.connect(ADDR)
my_socket.send(str(mp.cpu_count()))
while True:
rlist, wlist, xlist = select.select([my_socket], [my_socket], [])
for current_socket in rlist:
data = current_socket.recv(1024)
if not re.search('[a-zA-Z]', data):
dataList.append(data)
else:
md5hash = data
print md5hash
print dataList
print my_socket
decryptCall(dataList,md5hash)
服务器代码:
import time
import hashlib
import socket
import select
import msvcrt
import sys
open_client_sockets=[]
def decrypt(cpus2,text,):
seperated = []
place = 0
low = 1000000
high = 9999999
numbers = high-low
numbers /= cpus2
for g in range(cpus2):
seperated.append(low + numbers*g)
print open_client_sockets[0]
for g in range(len(open_client_sockets)):
print str(g) + ": " + str(cpus.get(open_client_sockets[g]))
for h in range(int(cpus.get(open_client_sockets[g]))):
time.sleep(0.01)
open_client_sockets[g].send(str(seperated[place]))
place+=1
open_client_sockets[g].send(text)
test()
def test():
print open_client_sockets[0].recv(10000)
if __name__ == "__main__":
md5hash2 = "fcea920f7412b5da7be0cf42b8c93759"
messages_to_send=[]
input = ''
addresses = {}
cpus = {}
cpus_count=0
server_socket = socket.socket()
server_socket.bind(('0.0.0.0', 1337))
server_socket.listen(5)
while True:
rlist, wlist, xlist = select.select( [server_socket] + open_client_sockets, open_client_sockets,[])
for current_socket in rlist:
if current_socket is server_socket:
(new_socket, address) = server_socket.accept()
addresses[new_socket] = address
open_client_sockets.append(new_socket)
#print addresses
else:
data = current_socket.recv(1024)
cpus_count += int(data)
cpus[current_socket] = data
if msvcrt.kbhit():
key = msvcrt.getch()
sys.stdout.write(key)
if key == '\r' and input != "":
print "\nok"
print cpus_count
decrypt(cpus_count,md5hash2)
input += key
问题是,当我尝试使用多处理时:
decrypt(list[i], int(list[i]) + rangeNums, text)
p = mp.Process(target=decrypt,args=(list[i], int(list[i]) + rangeNums, text))
p.start()
processes.append(p)
不会发送数据,因为套接字的值会发生变化。例如:
<socket._socketobject object at 0x029CAB58> -> <socket._socketobject object at 0x02941AE8>.
在试图解决这个问题时,我发现了一些奇怪的东西。 每次程序创建一个新进程时,套接字的值都会改变。 当我在没有多处理的情况下使用正常的函数调用时,套接字保持原样并且数据被发送。
答案 0 :(得分:1)
我没有一个完整的答案(如果我的名声更高,我会发表评论)。我相信你所看到的是尝试在父进程中建立的fork()d子中使用套接字的结果(它仍然在父进程中打开)。在这种情况下,您可能正在获取父级的副本。
一些解决方案: 你可以在孩子身上建立一个新的插座 您可以在fork之后关闭父级中的连接(或者在此情况下为进程启动)。
更多阅读fork和socket,或多处理和套接字。