vaeVictis ha scritto: ↑domenica 31 ottobre 2021, 10:24
Una domanda, @nuzzopippo: in generale, quando si avvia un programma che usa le porte per comunicare, si deve verificare che quella porta non sia già usata? Io non l'ho mai controllato, ma in effetti se fosse già in uso potrebbero arrivare segnali non voluti. Che dici?
Se una porta è già occupata, un socket non può aprila, si riceve
una eccezione ... giusto per esemplificare, prendiamo l'
esempio dello eco-server nella docs e manipoliamolo in modo da intercettare una eccezione qualsiasi
Codice: Seleziona tutto
# Echo server program
import socket
HOST = '' # Symbolic name meaning all available interfaces
PORT = 50007 # Arbitrary non-privileged port
try:
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind((HOST, PORT))
s.listen(1)
conn, addr = s.accept()
with conn:
print('Connected by', addr)
while True:
data = conn.recv(1024)
if not data: break
conn.sendall(data)
except Exception as e:
print(repr(e))
poi apriamo due sessioni di terminale, con entrambe andiamo nella directory dello script e lo lanciamo, la prima andrà liscia, il socket si mette in ascolto e rimane in attesa di connessioni sino a che un CTRL+C od un evento di sistema non lo sbatte fuori, il secondo lancio, invece :
Codice: Seleziona tutto
NzP:~$ cd src/posts/vaeVictis
NzP:~$ python3 server.py
OSError(98, 'Address already in use')
NzP:~$
trova la porta occupata (su tutti gli indirizzi disponibili) e riceve quindi un errore, lo comunica ed esce.
Tal genere di errore, credo di non sbagliare, sorge già a livello di sistema operativo, una porta non mi sembra sia concessa all'uso contemporaneo di due applicazioni diverse.
Quanto su accade dal lato server, dal lato client potrebbe NON succedere, se il server è inizializzato in modo da ricevere più comunicazioni, un clisent aprirebbe una porta "a caso" tra quelle disponibili e si connetterebbe alla specifica porta "50007" dello indirizzo di comunicazione, e varie sessioni client non interfirebbero tra loro.
... certo, non interferirebbero se il lato server è gestito correttamente, dato che ogni singolo collegamento ha una sua specifica e precisa connessione, poi a creare caos siamo tutti bravi, bastano idee poco chiare o un po' di disattenzione.
Comunque è un argomento "stuzzichevole", ogni tanto sono tentato di approfondire e sperimentare un po' sull'argomento, in particolare circa "strumenti" limitati ad una LAN locale, in genere li trovi in soluzioni "per internet", quindi con caratteristiche poco "prudenti" per l'ambito interno ... in ufficio ne ho realizzato qualcuno, principalmente con java, con python no, sono poco preparato ad operare in ambito windows con questo linguaggio.