Python - 多处理更改套接字的值

时间:2016-09-22 21:52:06

标签: python sockets encryption multiprocessing md5

我正在尝试编写一个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>.

在试图解决这个问题时,我发现了一些奇怪的东西。 每次程序创建一个新进程时,套接字的值都会改变。 当我在没有多处理的情况下使用正常的函数调用时,套接字保持原样并且数据被发送。

1 个答案:

答案 0 :(得分:1)

我没有一个完整的答案(如果我的名声更高,我会发表评论)。我相信你所看到的是尝试在父进程中建立的fork()d子中使用套接字的结果(它仍然在父进程中打开)。在这种情况下,您可能正在获取父级的副本。

一些解决方案: 你可以在孩子身上建立一个新的插座 您可以在fork之后关闭父级中的连接(或者在此情况下为进程启动)。

更多阅读fork和socket,或多处理和套接字。