#python #sockets #multiprocessing #md5
#python #сокеты #многопроцессорная обработка #md5
Вопрос:
я пытаюсь сделать расшифровку md5 сервер-клиент сервер отправляет, сколько у него ядер (cpu), и клиент нарезает его диапазон для многопроцессорной обработки (перебор), но сервер выдает мне «socket.error: [Errno 10048] Только одно использование каждого адреса сокета (протокол /обычно разрешается сетевой адрес / порт» ошибка есть какие-либо предложения?
клиент:
import socket
RANGE=10000
d="7a2b33c672ce223b2aa5789171ddde2f"
d=d.lower()
HOMEADDRES='127.0.0.1'
PORT=2345
ADDRESS=(HOMEADDRES,PORT)
my_socket=socket.socket(socket.AF_INET ,socket.SOCK_STREAM)
my_socket.connect((HOMEADDRES,PORT))
def main():
ranges=""
my_socket.send(d)
cores=int(my_socket.recv(1024))
borders=[0]
for i in range(1,cores 1):
borders.append(RANGE*i/cores)
for i in range(len(borders)):
ranges =str(borders[i]) "#"
ranges=ranges[:-1]
print ranges
my_socket.send(ranges)
print my_socket.recv(1024)
my_socket.close()
if __name__ == '__main__':
main()
сервер:
import socket
import multiprocessing
import hashlib
IP_ADD='0.0.0.0'
PORT=2345
ADDRESS = (IP_ADD,PORT)
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(ADDRESS)
server_socket.listen(1)
client_socket, address = server_socket.accept()
print "connected"
def decrypt(low,high,d):
print "1"
i=low
while i<high:
m=hashlib.md5()
m.update(str((i)))
if m.hexdigest()==d:
client_socket.send(i)
client_socket.close()
server_socket.close()
i =1
def main():
d=client_socket.recv(1024)
client_socket.send(str(multiprocessing.cpu_count()))
borders=client_socket.recv(1024)
borders=borders.split("#")
for i in range(len(borders)-1):
p=multiprocessing.Process(target=decrypt, args=(borders[i],borders[i 1],d))
p.start()
if __name__ == '__main__':
main()
Комментарии:
1. Переместите код, который находится снаружи
main()
(создавая сокет сервера), в начало main . Вы не показываете, какmain()
вызывается на сервере, я предполагаю, что он похож на клиент.
Ответ №1:
Вы создаете свой серверный сокет в области модуля, поэтому, как только модуль импортируется, он создается и привязывается к (0.0.0.0, 2345).
Многопроцессорная обработка приведет к тому, что модуль будет (повторно) импортирован в создаваемый им новый процесс, поэтому этот процесс немедленно попытается создать тот же серверный сокет на порту 2345, а это невозможно.
Мое предложение заключается в том, чтобы либо не создавать свой серверный сокет в области модуля, но сделать это в main(), либо переместить многопроцессорный материал в его собственный модуль.
Комментарии:
1. что такое его собственный модуль »
2. нужно ли мне записать его в другой скрипт и импортировать его?
3. да, создайте новый модуль, например, для расшифровки. выполните поиск и переместите туда фактическую логику дешифрования. Тем не менее, также полезно не создавать сокет в области модуля.
4. что вы, мужчины? что такое создание сокета без модуля?
5. Это основные вопросы Python, понимаете ли вы, как работают модули в Python? Также и я, и cdarke выше уже сказали, что делать, переместить материал внутри main() или в их собственный модуль. Это позволит избежать создания сокета каждый раз, когда модуль загружается процессом, порожденным многопроцессорной обработкой.
Ответ №2:
Приведенная ниже идиома python решила это для меня
if __name__ == "__main__":
app = web.Application()
web.run_app(app)