socket.error: [Errno 10048] Обычно разрешается только одно использование каждого адреса сокета (протокол / сетевой адрес / порт)

#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)