Моя программа случайным образом выбирает порт на стороне сервера, используя адрес ('0.0.0.0', 0)
, и уникальный code
отправляется на сторону клиента, где сокет пытается подключиться к каждому порту в пределах диапазона и проверяет наличие того же code
для подтверждения правильности порта сервера.
Проблема заключается в переборе всех портов (range(1024, 65336)
), и попытки подключиться к каждому из них очень медленны, даже если используется ThreadPool
.
Это просто пример, чтобы показать, что я пытаюсь сделать. Мой основной программный хост через inte rnet не на localhost.
server.py
import socket
CODE = 'Code123' # just an example
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
addr = ('0.0.0.0', 0)
server.bind(addr)
# Can see which port is assigned
print(server)
def start():
server.listen(5) # connect to 5 connection.
while True:
conn, addr = server.accept()
conn.send(CODE.encode('utf-8'))
print("Code Sent")
start()
cilent.py
import socket
from multiprocessing.pool import ThreadPool
code = 'Code123' # just an example
server = socket.gethostbyname(socket.gethostname())
port_left = 65336
found = False
def connect(port):
global port_left, code, server, found
if found: return
port_left -= 1
try:
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect((server, port))
if client.recv(len(code)).decode('utf-8') == code:
found = True
return client
else: client.close()
except Exception as e:
print(e, port_left)
return None
pool = ThreadPool(10)
values = [('c', i) for i in set(pool.map(connect, range(1024, 65336))) if i]
client = dict(values).get('c')
pool.close()
pool.join()
print(client)
Есть ли лучший способ достичь этой цели или повысить производительность моего существующего кода?