socket.error:[Errno 10048]通常只允许使用每个套接字地址(协议/网络地址/端口)

时间:2016-10-12 17:54:36

标签: python sockets multiprocessing 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()

2 个答案:

答案 0 :(得分:0)

您正在模块范围内创建服务器套接字,因此只要导入模块,就会创建并绑定到(0.0.0.0,2345)。

多处理将导致模块在其创建的新进程中被(重新)导入,因此该进程将立即尝试在端口2345上创建相同的服务器套接字,这是不可能的。

我的建议是要么不在模块范围内创建服务器套接字,而是在main()中创建服务器套接字,或者将多处理内容移动到自己的模块中。

答案 1 :(得分:0)

下面的python习惯用法为我解决了

if __name__ == "__main__":
    app = web.Application()
    web.run_app(app)