Недавно я экспериментировал с защитой паролем сокетов в python и столкнулся с проблемой.
При проверке ввода клиентов с установленным сервером паролем сервер, похоже, считает, что установленный пароль не совпадает с паролем, введенным пользователем.
Мой первый скрипт: server.py
import socket
import threading
from requests import get
import uuid
HEADER = 64
PORT = 9090
#To connect over the internet change SERVER to your public IP
SERVER = socket.gethostbyname(socket.gethostname())
ADDR = (SERVER, PORT)
FORMAT = 'utf-8'
DISCONNECT_MESSAGE = "!DISCONNECT"
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(ADDR)
def handle_client(conn, addr, password):
print(f"[PNet] NEW CONNECTION: {addr} connected.")
connected = True
while connected:
msg_length = conn.recv(HEADER).decode(FORMAT)
if msg_length:
msg_length = int(msg_length)
msg = conn.recv(msg_length).decode(FORMAT)
print(msg)
if msg == password:
connected = True
if msg != password:
print("Huh?")
if msg == DISCONNECT_MESSAGE:
connected = False
print(f"[PNet] {addr}: {msg}")
conn.send("[PNet] CLIENT: Message received.".encode(FORMAT))
conn.close()
def start():
print("[PNet] STARTING: Server is starting...")
print("[PNet] STARTING: Generating key...")
password = uuid.uuid4()
print(f"[PNet] FINALIZING: Key generated: {password}")
server.listen()
print(f"[PNet] LISTENING: Server is listening on {SERVER}.")
while True:
conn, addr = server.accept()
thread = threading.Thread(target=handle_client, args=(conn, addr, password))
thread.start()
#print(f"[PNet] ACTIVE CONNECTIONS: {threading.activeCount() - 1}")
start()
и мой второй скрипт: client.py
import socket
HEADER = 64
PORT = 9090
FORMAT = 'utf-8'
DISCONNECT_MESSAGE = "!DISCONNECT"
SERVER = input("[PNet] CLIENT: Server IP: ")
PASS = input("[PNet] SERVER: Enter password: ")
ADDR = (SERVER, PORT)
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(ADDR)
def send(msg):
message = msg.encode(FORMAT)
msg_length = len(message)
send_length = str(msg_length).encode(FORMAT)
send_length += b' ' * (HEADER - len(send_length))
client.send(send_length)
client.send(message)
print(client.recv(2048).decode(FORMAT))
send(PASS)
connected = True
while connected:
msg = input("[PNet] CLIENT: Send a message: ")
if msg != DISCONNECT_MESSAGE:
send(msg)
else:
send(msg)
connected = False
при запуске и копировании пароля точно с терминала все равно возвращает False. Спасибо за вашу помощь :)
Вы сопоставляете объект UUID со строкой, поэтому он возвращает false,
проверить, поставить отпечаток перед сравнением,
...
print(type(msg),type(password)) # will print <class 'str'> <class 'uuid.UUID'>
if msg == password:
connected = True
...
чтобы решить эту проблему, передайте пароль в виде строки,
password = str(uuid.uuid4())
Имейте в виду, что
socket.recv(n)
не гарантирует возвратn
байт. Возможно, вам придется повторно читать, пока вы не получите достаточно.