2016-09-22 4 views
0

私は、LANを使用して解読し、各PC上で利用可能なすべてのCPUを使用するMD5解読プログラムをプログラミングしようとしています。 クライアントコード:Python - マルチプロセッシングでソケットの値が変更される

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

私は完全に形成された答えがありません(私の評判が高い場合はコメントを残しています)。あなたが見ているのは、親プロセスで確立されたfork()d子でソケットを使用しようとした結果であると信じています(まだ親プロセスで開いています)。この場合、おそらく親のコピーを取得しています。

いくつかの解決策: 子に新しいソケットを確立することができます。
fork(またはこの場合はプロセスの開始)の後に、親の接続を閉じることができます。

ルックアップフォークとソケット、またはマルチプロセッシングとソケットを参照してください。

関連する問題